AVCaptureMovieFileOutput вызывает неправильную ориентацию при сохранении фотографии в Camera Roll
У меня странная проблема с captureStillImageAsynchronouslyFromConnection. Если я сохраню изображение с помощью jpegStillImageNSDataRepresentation во время зеркального отображения видео, изображение в камере поворачивается на 90 градусов по часовой стрелке. Однако, если это не отражается, ориентация в порядке. Выложу код, у кого-нибудь еще есть эта проблема / знаете исправление?
Обновление: только что провел несколько тестов, высота и ширина (640x480) в порядке и отражают ориентацию устройства. Когда я делаю снимок в портретном режиме, он сообщает об UIImageOrientationLeft, а при отражении - UIImageOrientationLeftMirrored.
Обновление 2: при просмотре сохраненной фотографии в рулоне камеры предварительный просмотр изображения имеет правильную ориентацию, как и изображение при пролистывании между фотографиями, но когда фотография полностью загружена, она поворачивается на 90 градусов. Может ли это быть проблема рулона камеры? (Я на 4.3.3)
- (void) captureImageAndSaveToCameraRoll
{
AVCaptureConnection *stillImageConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]];
if ([stillImageConnection isVideoOrientationSupported])
[stillImageConnection setVideoOrientation:[self orientation]];
[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:stillImageConnection
completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
ALAssetsLibraryWriteImageCompletionBlock completionBlock = ^(NSURL *assetURL, NSError *error) {
if (error) {
if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)]) {
[[self delegate] captureManager:self didFailWithError:error];
}
}
};
if (imageDataSampleBuffer != NULL) {
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
UIImage *image = [[UIImage alloc] initWithData:imageData];
[library writeImageToSavedPhotosAlbum:[image CGImage]
orientation:(ALAssetOrientation)[image imageOrientation]
completionBlock:completionBlock];
[image release];
[library release];
}
else
completionBlock(nil, error);
if ([[self delegate] respondsToSelector:@selector(captureManagerStillImageCaptured:)]) {
[[self delegate] captureManagerStillImageCaptured:self];
}
}];
}
3 ответа
Мне интересно, действительно ли у вновь созданного изображения установлена ориентация, как вы предполагаете здесь:
[library writeImageToSavedPhotosAlbum:[image CGImage] orientation: (ALAssetOrientation) [image imageOrientation] completionBlock:completionBlock];
[image imageOrientation]
в частности, кажется, потенциально источник проблемы, особенно с необходимыми актерами...
Вы говорите, что видите ориентацию изображения где-то [image imageOrientation]
только после создания с помощью:
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: imageDataSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
Мне интересно, если вы предполагаете, что эти метаданные находятся в imageData
вернулся из AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:
когда это на самом деле содержит только данные пикселей изображения?
Создайте категорию для UIImage, описанную в iOS UIImagePickerController Ориентация изображения результата после загрузки
Вызовите этот метод на изображении, прежде чем сохранить его в своей библиотеке.
По некоторым данным, приложение для фотографий iPhone в 2009 году вообще не поддерживало зеркальную ориентацию; вполне возможно, что они частично это исправили, но в некоторых случаях все еще есть ошибки (я знаю, например, что UIImageView не обрабатывает contentStretch
правильно в некоторых случаях). Это должно быть достаточно просто для тестирования: просто загрузите образцы изображений из этого блога в камеру и посмотрите, что произойдет.