He estado rasgándome el pelo intentando que la cámara AVFoundation capture una imagen en la orientación correcta (es decir, la orientación del dispositivo) pero no puedo hacer que funcione.iPhone AVFoundation orientación de la cámara
He visto tutoriales, he visto la presentación de WWDC y he descargado el programa de ejemplo WWDC, pero incluso eso no lo hace.
El código de mi aplicación es ...
AVCaptureConnection *videoConnection = [CameraVC connectionWithMediaType:AVMediaTypeVideo fromConnections:[imageCaptureOutput connections]];
if ([videoConnection isVideoOrientationSupported])
{
[videoConnection setVideoOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
[imageCaptureOutput captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error)
{
if (imageDataSampleBuffer != NULL)
{
//NSLog(@"%d", screenOrientation);
//CMSetAttachment(imageDataSampleBuffer, kCGImagePropertyOrientation, [NSString stringWithFormat:@"%d", screenOrientation], 0);
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
[self processImage:image];
}
}];
(processImage utiliza el mismo método writeImage ... como el código de la WWDC)
y el código de la aplicación de la WWDC es ...
AVCaptureConnection *videoConnection = [AVCamDemoCaptureManager connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]];
if ([videoConnection isVideoOrientationSupported]) {
[videoConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
}
[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection
completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
if (imageDataSampleBuffer != NULL) {
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:[image CGImage]
orientation:(ALAssetOrientation)[image imageOrientation]
completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
id delegate = [self delegate];
if ([delegate respondsToSelector:@selector(captureStillImageFailedWithError:)]) {
[delegate captureStillImageFailedWithError:error];
}
}
}];
[library release];
[image release];
} else if (error) {
id delegate = [self delegate];
if ([delegate respondsToSelector:@selector(captureStillImageFailedWithError:)]) {
[delegate captureStillImageFailedWithError:error];
}
}
}];
al comienzo de su código que defina el AVOrientation al retrato que parece muy extraño, pero estoy tratando de conseguir que se detecta la orientación actual del dispositivo y utilizar eso.
Como puedes ver, he puesto [UIApplication sharedApplication] statusBarOrientation para intentar obtener esto, pero aún así solo guardo las fotos en vertical.
¿Alguien puede ofrecer alguna ayuda o consejo sobre lo que debo hacer?
Gracias!
Oliver
Bueno, pensé que había arreglado pero por desgracia estaba equivocado. Soluciona el problema de mostrar la imagen en el teléfono y la guarda correctamente en la biblioteca, pero cuando se cargan en Facebook o se miran en mi computadora, siguen estando equivocados :( – Fogmeister
¿Cuál fue su solución final? Noté una rareza que su publicación me ayudó con. UIDeviceOrientation y AVCaptureVideoOrientation no son idénticos. LandscapeRight y LandscapeLeft se intercambian en la enumeración. Me estaba haciendo un largo (si retrato/conjunto retrato, si paisaje izquierda/establece paisaje izquierda) y mis imágenes de paisaje siempre estaban boca abajo! Parece que el intercambio es necesario para mantener la asignación correcta, pero no estoy seguro de cómo funciona. –
Hmm.Para mí, la orientación de la miniatura en la biblioteca de fotos se rota, pero la imagen en sí misma está bien. –