2011-06-15 19 views
5

Tengo un problema extraño con captureStillImageAsynchronouslyFromConnection. Si guardo la imagen usando jpegStillImageNSDataRepresentation mientras el video está en espejo, la imagen en el rollo de la cámara gira 90 grados en el sentido de las agujas del reloj. Sin embargo, si no se refleja, la orientación es correcta. Voy a publicar el código, ¿alguien más tiene este problema/conozco una solución?AVCaptureMovieFileOutput provoca una orientación incorrecta al guardar fotos en Camera Roll

Actualización: Solo realicé algunas pruebas, las alturas y el ancho (640x480) están bien y reflejan la orientación del dispositivo. Cuando tomo una foto en vertical, informa UIImageOrientationLeft y cuando se refleja, UIImageOrientationLeftMirrored.

Actualización 2: Cuando veo la foto guardada en el carrete, la vista previa de la imagen tiene la orientación correcta, al igual que la imagen cuando desliza entre fotos, pero cuando la foto está completamente cargada, gira 90 grados . ¿Podría ser un problema de rollo de cámara? (Estoy en 4.3.3)

- (void) captureImageAndSaveToCameraRoll 
{ 
    AVCaptureConnection *stillImageConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]]; 
    if ([stillImageConnection isVideoOrientationSupported]) 
     [stillImageConnection setVideoOrientation:[self orientation]]; 

    [[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:stillImageConnection 
                 completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 

                  ALAssetsLibraryWriteImageCompletionBlock completionBlock = ^(NSURL *assetURL, NSError *error) { 
                   if (error) { 
                    if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)]) { 
                     [[self delegate] captureManager:self didFailWithError:error]; 
                    } 
                   } 
                  }; 

                  if (imageDataSampleBuffer != NULL) { 
                   NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
                   ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

                   UIImage *image = [[UIImage alloc] initWithData:imageData]; 
                   [library writeImageToSavedPhotosAlbum:[image CGImage] 
                          orientation:(ALAssetOrientation)[image imageOrientation] 
                         completionBlock:completionBlock]; 
                   [image release]; 

                   [library release]; 
                  } 
                  else 
                   completionBlock(nil, error); 

                  if ([[self delegate] respondsToSelector:@selector(captureManagerStillImageCaptured:)]) { 
                   [[self delegate] captureManagerStillImageCaptured:self]; 
                  } 
                 }]; 
} 
+0

para depurar esto, podría ser útil si genera image.size y imageOrientation en ambos modos, ¿qué valores obtiene? – mackross

+0

Solo realicé algunas pruebas, las alturas y el ancho (640x480) están bien y reflejan la orientación del dispositivo. Cuando tomo una foto en vertical, informa UIImageOrientationLeft y cuando se refleja, UIImageOrientationLeftMirrored. –

Respuesta

2

me pregunto si la imagen recién creada tiene realmente que está establecido orientación que usted está asumiendo aquí:

[library writeImageToSavedPhotosAlbum:[image CGImage] orientation: (ALAssetOrientation) [image imageOrientation] completionBlock:completionBlock]; 

[image imageOrientation] en particular, parece potencialmente la fuente del problema, especialmente con el elenco requiere .. .

se dice que está viendo la orientación de la imagen en alguna parte, es desde [image imageOrientation] justo después de la creación con:

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: imageDataSampleBuffer]; 
UIImage *image = [[UIImage alloc] initWithData:imageData]; 

Me pregunto si está asumiendo que este metadato está en el imageData devuelto desde AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: cuando de hecho solo contiene los datos del píxel de la imagen en sí mismo.

+0

Tenga en cuenta que está [documentado específicamente] (http://developer.apple.com/library/ios/documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40009722-CH1- SW4) que UIImageOrientation se puede convertir a ALAssetOrientation. – Anomie

+0

ah, bueno, excelente! ¿Está obteniendo el valor correcto? Como dije antes, me pregunto si los metadatos están llegando a 'imageData' y luego se analizarán y se agregarán a la' imagen'. Solo estoy tratando de rastrear dónde comienzan los datos y se mueve a través del sistema, ya que no parece llegar a donde necesita, si entiendo su pregunta. – Dad

0

Según some reports, fotos de aplicaciones del iPhone en el 2009 no apoyó ninguna de las orientaciones reflejadas en absoluto; sin duda es posible que hayan corregido parcialmente esto, pero todavía tienen errores en algunos casos (sé, por ejemplo, que UIImageView no maneja correctamente el contentStretch en algunos casos). Esto debería ser lo suficientemente fácil de probar: simplemente cargue las imágenes de muestra de ese blog en el rollo de la cámara y vea qué sucede.

+0

El código que estoy usando es una mezcla de AVCam 1.0 y 1.2 más mi propio código. Supongo que esta es la razón por la cual no puedes guardar una foto en AVCam 1.2. Estúpido. ¿Por qué tengo que guardar la foto como reflejada en absoluto? Todo lo que quiero hacer es guardar una foto del video duplicado. –

+0

¿Hay una manera simple de tomar una foto y voltearla verticalmente antes de guardarla en el rollo de la cámara? –

+1

@WDyson: Claro, vea http://stackoverflow.com/questions/5427656/ios-uiimagepickercontroller-result-image-orientation-after-upload/5427890#5427890 para obtener una pregunta previa a lo largo de esas líneas exactas. – Anomie

0

crear la categoría de UIImage describen en iOS UIImagePickerController result image orientation after upload

llama a este método en la imagen antes de guardarlo en su biblioteca.

+0

Lo curioso. Mis imágenes ahora están giradas 180 grados, al revés. –

+0

Tendrá que revisar esto para hacer lo que quiera. Aunque la lógica debería ser similar. – hundreth

+1

Me tomé la libertad de editar su respuesta para vincularla a mi respuesta anterior sobre rotación de imágenes, en lugar de copiarla textualmente. -1 por el plagio, y por copiar tu respuesta del enlace que publiqué en un comentario a mi respuesta 14 horas antes. – Anomie

Cuestiones relacionadas