AVCaptureMovieFileOutput que causa una orientación incorrecta al save la fotografía en Camera Roll

Tengo un problema extraño con captureStillImageAsynchronouslyFromConnection. Si guardo la image usando jpegStillImageNSDataRepresentation mientras se reproduce el video, la image en el rollo de la camera se gira 90 grados en el sentido de las agujas del reloj. Sin embargo, si no está reflejado, la orientación está bien. Publicaré el código, ¿alguien más tiene este problema / conoce una solución?

Actualización: simplemente ejecuté algunas testings, las alturas y anchos (640×480) están bien y reflejan la orientación del dispositivo. Cuando tomo una foto en retrato, informa UIImageOrientationLeft y cuando se refleja, UIImageOrientationLeftMirronetworking.

Actualización 2: Cuando veo la foto guardada en el rollo de la camera, la vista previa de la image tiene la orientación correcta, al igual que la image cuando desliza entre las fotografías, pero cuando la foto está completamente cargada, gira 90 grados. ¿Podría ser un problema de rollo de camera? (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(captureManagerStillImageCaptunetworking:)]) { [[self delegate] captureManagerStillImageCaptunetworking:self]; } }]; } 

Me pregunto si la image recién creada realmente tiene su orientación establecida, como usted está asumiendo aquí:

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

[image imageOrientation] en particular parece ser potencialmente la fuente del problema, especialmente con el yeso requerido …

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

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

Me pregunto si usted está asumiendo que estos metadatos están en imageData devueltos desde AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: cuándo eso de hecho solo contiene los datos de píxeles de la image en sí?

Según algunos informes , la aplicación de fotos del iPhone en 2009 no admitía ninguna de las orientaciones reflejadas; es posible que hayan reparado parcialmente pero que aún tengan errores en algunos casos (por ejemplo, sé que UIImageView no maneja contentStretch correctamente en algunos casos). Esto debería ser bastante fácil de probar: basta con cargar las imágenes de muestra de ese blog en el rollo de la camera y ver qué sucede.

Cree la categoría para UIImage descrita en la orientación de la image de resultado UIImagePickerController de iOS después de la carga.

Llame a este método en la image antes de savelo en su biblioteca.