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 правильно в некоторых случаях). Это должно быть достаточно просто для тестирования: просто загрузите образцы изображений из этого блога в камеру и посмотрите, что произойдет.

Другие вопросы по тегам