Warum funktioniert die Aufnahme von Bildern mit AVFoundation mir 480x640 Bilder, wenn die voreingestellten 640x480 ist?
Habe ich einige ziemlich basic-code, um ein Standbild mit 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];
Meine Methode erfasst das Standbild ist auch Recht einfach und druckt die Ausrichtung, die 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);
}];
}
Damit das Gerät versteht es im portrait-Modus, wie es sein sollte, die exif-Geräten zeigen mir:
PixelXDimension = 640;
PixelYDimension = 480;
so scheint es, zu wissen, dass wir in 640x480 und das bedeutet, dass BxH (offensichtlich...)
Allerdings, wenn ich E-Mail das Foto, um mich von Apples Fotos-app, bekomme ich eine 480x640 Bild, wenn ich überprüfen Sie die Eigenschaften in der Vorschau. Dies machte keinen Sinn für mich, bis ich grub weiter in den Bild-Eigenschaften zu erfahren, dass die Bild-Ausrichtung ist "6 (um 90 ° Gedreht CCW)" ich bin sicher, CCW gegen den Uhrzeigersinn
So sah das Bild im browser:
http://tonyamoyal.com/stuff/things_that_make_you_go_hmm/photo.JPG
Sehen wir das Bild um 90 ° gedreht CCW und es ist 640x480.
Ich bin wirklich verwirrt über dieses Verhalten. Wenn ich eine 640x480 Standbild mit AVFoundation, würde ich erwarten, dass der Standard keine Drehung. Ich erwarte ein Bild der Größe 640x480 orientiert, genau wie mein Auge sieht das Bild in der Vorschau-Ebene. Kann jemand erklären, warum dies geschieht und wie die Konfiguration der Erfassung, so dass, wenn ich speichern mein Bild an den server, um später die Anzeige in einem web-Ansicht, es ist nicht um 90 ° gedreht CCW?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht, weil die Orientierung festlegen, in der die Metadaten für das neue Bild wird beeinflusst durch die Ausrichtung des AV-system, dass es schafft. Das layout der eigentlichen Bild-Daten ist, natürlich, Verschieden von der Orientierung erwähnt in Ihren Metadaten. Einige Bildbearbeitungs-Programme respektieren die Metadaten Orientierung, manche ignorieren es.
Können Sie Einfluss auf die Metadaten Ausrichtung des AV-Systems durch den Aufruf:
Können Sie Einfluss auf die Metadaten Ausrichtung eines UIImage durch aufrufen:
Aber die eigentlichen Daten aus der AVCapture system wird immer angezeigt, mit der größeren dimension wie X und die schmalere dimension als Y, und werden zu sein scheinen, orientiert sich in LandscapeLeft.
Wenn Sie möchten, dass die eigentlichen Daten zu line-up mit was Sie Ihre Metadaten Ansprüche, müssen Sie zum ändern der eigentlichen Daten. Sie können dies tun, indem Sie die Bild, um ein neues Bild mit CGContexts und AffineTransforms. Oder gibt es eine einfachere Abhilfe. Verwenden Sie die UIImage+Resize-Paket diskutiert, wie hier. Und das Bild verkleinern, um es der aktuellen Größe durch aufrufen von:
Diese korrigieren können die Daten der Ausrichtung als Nebenwirkung.
Wenn Sie nicht möchten, dass das gesamte UIImage+die Größe Sache, die Sie heraus überprüfen können Sie code-und ausziehen die Teile, wo die Daten transformiert.