Sto utilizzando le classi AVFoundation per implementare una fotocamera personalizzata nella mia app. Sto solo catturando immagini fisse, non video. Ho tutto funzionante, ma sono perplesso da qualcosa. Prendo in considerazione l'orientamento del dispositivo quando viene catturata un'immagine fissa e impostiamo l'opzione VideoOrientation della connessione video in modo appropriato. Un frammento di codice:Perché le modalità paesaggio AVCaptureVideoOrientation risultano in immagini ferme capovolte?
// set the videoOrientation based on the device orientation to
// ensure the pic is right side up for all orientations
AVCaptureVideoOrientation videoOrientation;
switch ([UIDevice currentDevice].orientation) {
case UIDeviceOrientationLandscapeLeft:
// Not clear why but the landscape orientations are reversed
// if I use AVCaptureVideoOrientationLandscapeLeft here the pic ends up upside down
videoOrientation = AVCaptureVideoOrientationLandscapeRight;
break;
case UIDeviceOrientationLandscapeRight:
// Not clear why but the landscape orientations are reversed
// if I use AVCaptureVideoOrientationLandscapeRight here the pic ends up upside down
videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
break;
case UIDeviceOrientationPortraitUpsideDown:
videoOrientation = AVCaptureVideoOrientationPortraitUpsideDown;
break;
default:
videoOrientation = AVCaptureVideoOrientationPortrait;
break;
}
videoConnection.videoOrientation = videoOrientation;
Nota i miei commenti nei casi di paesaggio. Devo invertire la mappatura dell'orientamento o l'immagine risultante è capovolta. Cattura e salva l'immagine con il seguente codice:
[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
self.stillImage = [UIImage imageWithData:imageData];
// notify observers (image gets saved to the camera roll)
[[NSNotificationCenter defaultCenter] postNotificationName:CaptureSessionManagerDidCaptureStillImageNotification object:self];
self.stillImage = nil;
}];
Non vi sono altre elaborazioni o manipolazioni di immagini.
La mia app funziona con il codice sopra. Sto solo cercando di capire perché le costanti di orientamento devono essere invertite per gli orientamenti del paesaggio. Grazie!
Non usare l'orientamento UIDevice quando effettivamente desidera utilizzare Orientamento dell'interfaccia utente. – Till
In questo caso non è possibile utilizzare l'orientamento 'UIInterface'. L'orientamento del dispositivo al momento della cattura dell'immagine è sempre corretto. l'orientamento dell'immagine di 'stillImage' dopo che i dati sono stati acquisiti non è corretto. Sono stato in grado di risolvere il problema utilizzando UIDeviceOrientation e di tradurre in UIImageOrientation appropriato durante la rotazione. A quel tempo, nessuno stava intervenendo qui, quindi non ho inserito il codice. Se avrò tempo, aggiungerò il codice. – XJones
@XJones, si prega di aggiornare la risposta con la soluzione esatta. – Hemang