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
Vous devez vous connecter pour publier un commentaire.
Cela se produit parce que l'orientation définie dans les métadonnées de l'image est effectuée par l'orientation du système AV qui le crée. La mise en page des données réelles de l'image est bien sûr différente de l'orientation mentionnée dans vos métadonnées. Certains d'affichage des images des programmes de respecter les métadonnées d'orientation, certains l'ignorent.
Vous pouvez modifier les métadonnées d'orientation du système AV en appelant le:
Vous pouvez modifier les métadonnées de l'orientation d'une UIImage en appelant le:
Mais les données réelles de la AVCapture système apparaîtra toujours avec la dimension plus large que X et la dimension plus étroite que Y, et semble être orienté dans LandscapeLeft.
Si vous souhaitez que les données réelles de la ligne jusqu'à ce que votre métadonnées des réclamations, vous devez modifier les données réelles. Vous pouvez le faire par écrit, de l'image à une nouvelle image à l'aide de CGContexts et AffineTransforms. Ou il y a une solution plus facile, utilisez le UIImage+Redimensionner package tel que discuté ici. Et redimensionner l'image à sa taille actuelle en appelant le:
Cela va permettre de corriger les données de l'orientation comme un effet secondaire.
Si vous ne voulez pas inclure l'ensemble de la UIImage+Redimensionner chose que vous pouvez télécharger son code et d'en extraire les parties où les données transformées.
Solution sympa!!
Très utile, merci!
Magnifique!!! Fonctionne comme un charme.
OriginalL'auteur veltrop