AVCaptureMovieFileOutput causant une mauvaise orientation lors de l'enregistrement sur photo rouleau caméra

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

Question

J'ai un problème étrange avec captureStillImageAsynchronouslyFromConnection. Si je sauvegarde l'image en utilisant jpegStillImageNSDataRepresentation pendant que la vidéo est en miroir, l'image dans le rouleau de la caméra pivote de 90 degrés dans le sens horaire. Cependant, si elle ne reflète, l'orientation est très bien. Je vais poster le code, quelqu'un d'autre a ce problème / savoir d'un correctif?

Mise à jour: Juste couru quelques tests, les hauteurs et largeurs (640x480) sont très bien et reflètent l'orientation de l'appareil. Quand je prends une photo en mode portrait, il rend compte UIImageOrientationLeft et quand miroir, UIImageOrientationLeftMirrored.

Mise à jour 2: Quand je regarde la photo enregistrée dans le rouleau de la caméra, l'aperçu de l'image a l'orientation à droite, tout comme l'image lorsque vous glissez entre les photos, mais quand la photo est complètement chargé, il pivote de 90 degrés. Serait-ce un problème de rouleau appareil photo? (Je suis sur 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];
                                                             }
                                                         }];
}
Était-ce utile?

La solution

Je me demande si vous l'image nouvellement créée a vraiment son jeu d'orientation que vous assumez ici:

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

[image imageOrientation] en particulier, semble potentiellement la source du problème, en particulier avec les acteurs nécessaires ...

vous dites que vous voyez l'orientation de l'image quelque part, est-il de [image imageOrientation] juste après avoir créé avec:

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

Je me demande si vous présumez que ces métadonnées est dans le retour de imageData AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: quand ce ne contient en effet les données de pixels d'image elle-même?

Autres conseils

Selon certains rapports , l'application de photos de l'iPhone de retour en 2009 didn « t soutenir une quelconque des orientations en miroir du tout; il est certainement possible qu'ils ont en partie fixe cela, mais encore des bugs dans certains cas (je sais, par exemple, que UIImageView ne gère pas correctement contentStretch dans certains cas). Cela devrait être assez facile à tester:. Il suffit de charger les exemples d'images de ce blog dans le rouleau de la caméra et voir ce qui se passe

Créer la catégorie pour UIImage décrit dans iOS image résultat UIImagePickerController orientation après le téléchargement

Appelez cette méthode sur l'image avant de l'enregistrer à votre bibliothèque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top