AVCapTureMovIhieFileOutput che causa un orientamento errato quando si salva la foto al rullo della fotocamera

StackOverflow https://stackoverflow.com/questions/6351642

Domanda

Ho uno strano problema con CapturestillimageasynchronouslyfromConnection. Se salvo l'immagine utilizzando JpeGStillIlimagensDatarePresentation mentre il video è rispecchiato, l'immagine nel rotolo della fotocamera viene ruotata di 90 gradi in senso orario. Tuttavia, se non si spera, l'orientamento va bene. Pubblicherò il codice, qualcun altro ha questo problema/Conoscere una soluzione?

AGGIORNAMENTO: Basta eseguire alcuni test, le altezze e le larghezze (640x480) vanno bene e riflettono l'orientamento del dispositivo. Quando scatto una foto in ritratto, riporta uiIMageorientationLeft e quando mirrord, uiIMageorientationLeftMirrored.

AGGIORNAMENTO 2: quando visualizzo la foto salvata nel rotolo della fotocamera, l'anteprima dell'immagine ha l'orientamento giusto, così come l'immagine quando si scorre tra le foto, ma quando la foto è completamente caricata, ruota di 90 gradi. Potrebbe essere un problema di rotolo della fotocamera? (Sono su 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];
                                                             }
                                                         }];
}
È stato utile?

Soluzione

Mi chiedo se l'immagine appena creata abbia davvero il suo set di orientamento mentre presumi qui:

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

[image imageOrientation] in particolare sembra potenzialmente la fonte del problema, specialmente con il cast richiesto ...

dici che stai vedendo l'orientamento dell'immagine da qualche parte, viene da [image imageOrientation] Subito dopo averlo creato con:

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

Mi chiedo se presumo che questo metadati sia nel imageData restituito da AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: Quando in realtà questo contiene solo i dati di immagine pixel stessi?

Altri suggerimenti

Secondo Alcuni rapporti, l'applicazione delle foto dell'iPhone nel 2009 non ha supportato affatto gli orientamenti a specchio; È certamente possibile che lo abbiano parzialmente risolto ma abbiano ancora bug in alcuni casi (lo so, ad esempio, che UiImageView non gestisce contentStretch correttamente in alcuni casi). Questo dovrebbe essere abbastanza facile da testare: basta caricare le immagini di esempio da quel blog nel rotolo della fotocamera e vedere cosa succede.

Creare la categoria per uiimage descritta in iOS UiImagePickerController Orientamento dell'immagine dopo il caricamento

Chiama questo metodo sull'immagine prima di salvarlo nella tua libreria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top