Pourquoi ne capturer des images avec AVFoundation me donner 480x640 images lorsque le préréglage est de 640x480?

J'ai un peu assez de code de base pour capturer une image fixe à l'aide de AVFoundation.

AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self backFacingCamera] error:nil];

    AVCaptureStillImageOutput *newStillImageOutput = [[AVCaptureStillImageOutput alloc] init];

    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
                                    AVVideoCodecJPEG, AVVideoCodecKey,
                                    nil];


    [newStillImageOutput setOutputSettings:outputSettings];
    [outputSettings release];


    AVCaptureSession *newCaptureSession = [[AVCaptureSession alloc] init];
    [newCaptureSession beginConfiguration];
    newCaptureSession.sessionPreset = AVCaptureSessionPreset640x480;

    [newCaptureSession commitConfiguration];
    if ([newCaptureSession canAddInput:newVideoInput]) {
        [newCaptureSession addInput:newVideoInput];
    }
    if ([newCaptureSession canAddOutput:newStillImageOutput]) {
        [newCaptureSession addOutput:newStillImageOutput];
    }
    self.stillImageOutput = newStillImageOutput;
    self.videoInput = newVideoInput;
    self.captureSession = newCaptureSession;

    [newStillImageOutput release];
    [newVideoInput release];
    [newCaptureSession release];

Ma méthode de capture d'image fixe est également assez simple et imprime l'orientation qui est AVCaptureVideoOrientationPortrait:

- (void) captureStillImage
{
    AVCaptureConnection *stillImageConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]];

    if ([stillImageConnection isVideoOrientationSupported]){
        NSLog(@"isVideoOrientationSupported - orientation = %d", orientation);
        [stillImageConnection setVideoOrientation:orientation];
    }

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


                                                             ALAssetsLibraryWriteImageCompletionBlock completionBlock = ^(NSURL *assetURL, NSError *error) {
                                                                 if (error) { //HANDLE }
                                                             };

                                                                 if (imageDataSampleBuffer != NULL) {

                                                                 CFDictionaryRef exifAttachments = CMGetAttachment(imageDataSampleBuffer, kCGImagePropertyExifDictionary, NULL);
                                                                 if (exifAttachments) {
                                                                     NSLog(@"attachements: %@", exifAttachments);
                                                                 } else { 
                                                                     NSLog(@"no attachments");
                                                                 }
                                                                 self.stillImageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];                                                                  
                                                                 self.stillImage = [UIImage imageWithData:self.stillImageData];

                                                                 UIImageWriteToSavedPhotosAlbum(self.stillImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
                                                     }
                                                             else
                                                                 completionBlock(nil, error);

                                                         }];
}

De sorte que le dispositif comprend qu'il est en mode portrait comme il se doit, les exif attachements me montrer:

PixelXDimension = 640;
PixelYDimension = 480;

de sorte qu'il semble savoir que nous sommes en 640 x 480 et cela signifie que Lxh (évidemment...)

Cependant, quand je e-mail la photo de moi-même à partir de Pommes app Photos, je reçois un 480x640 image si je vérifie les propriétés dans l'Aperçu. Cela n'avait aucun sens pour moi jusqu'à ce que j'ai creusé plus loin dans les propriétés de l'image pour savoir que l'orientation d'image est réglé sur "6 (Rotation de 90 degrés vers la GAUCHE)" je suis sûr que CCW est dans le sens antihoraire

Donc en regardant l'image dans un navigateur:
http://tonyamoyal.com/stuff/things_that_make_you_go_hmm/photo.JPG
Nous voyons tourner l'image de 90 degrés vers la GAUCHE et il est de 640x480.

Je suis vraiment confus au sujet de ce comportement. Quand je prends une résolution de 640x480 image fixe à l'aide de AVFoundation, je m'attends à le défaut de ne pas avoir de rotation de l'orientation. Je m'attends à une image de 640x480 orienté exactement comme mon œil voit l'image dans l'aperçu de la couche. Quelqu'un peut m'expliquer pourquoi ce qui se passe et comment configurer la capture de sorte que lorsque j'enregistre mon image sur le serveur pour plus tard affichage en mode web, il n'est pas une rotation de 90 degrés vers la GAUCHE?

OriginalL'auteur Tony | 2011-08-07