Pregunta

Tengo un problema extraño con CaptureStillimageasynchrony de la Connection. Si guardo la imagen usando jpegstillimagensdatarepresentation mientras el video se refleja, la imagen en el rollo de la cámara gira 90 grados en sentido horario. Sin embargo, si no se refleja, la orientación está bien. Publicaré el código, ¿alguien más tiene este problema/sabe de una solución?

ACTUALIZACIÓN: Simplemente realizó algunas pruebas, las alturas y los anchos (640x480) están bien y reflejan la orientación del dispositivo. Cuando tomo una foto en el retrato, informa UiImageOrientationLeft y cuando se refleja, UiImageorientAleftMirredmirred.

ACTUALIZACIÓN 2: Cuando veo la foto guardada en el rollo de cámara, la vista previa de la imagen tiene la orientación correcta, al igual que la imagen cuando desliza entre las fotos, pero cuando la foto está completamente cargada, gira 90 grados. ¿Podría ser este 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];
                                                             }
                                                         }];
}
¿Fue útil?

Solución

Me pregunto si la imagen recién creada realmente tiene su conjunto de orientación como supone 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 requerido ...

Dices que estás viendo la orientación de la imagen en alguna parte, ¿es de [image imageOrientation] justo después de crearlo con:

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

Me pregunto si estás asumiendo que estos metadatos están en el imageData devuelto de AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: ¿Cuándo eso de hecho solo contiene los datos de píxeles de imagen?

Otros consejos

De acuerdo a algunos informes, la aplicación Fotos del iPhone en 2009 no admitió ninguna de las orientaciones reflejadas; Ciertamente es posible que lo arreglaran parcialmente, pero aún tengan errores en algunos casos (lo sé, por ejemplo, que UiImageView no maneja contentStretch correctamente en algunos casos). Esto debería ser bastante fácil de probar: simplemente cargue las imágenes de muestra de ese blog en el rollo de cámara y vea qué sucede.

Cree la categoría para UIImage descrita en iOS uiiMagePickerController Resultado de la imagen Orientación después de la carga

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top