AVCaptureMovieFileOutput вызывает неправильную ориентацию при сохранении фотографии в Camera Roll - PullRequest
5 голосов
/ 15 июня 2011

У меня странная проблема с 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 ]

2 голосов
/ 24 июня 2011

Мне интересно, действительно ли у вновь созданного изображения установлена ​​ориентация, как вы предполагаете здесь:

[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:, когда это фактически содержит только данные о пикселях изображения?

0 голосов
/ 20 июня 2011

Создание категории для UIImage, описанной в Ориентация изображения результата iOS UIImagePickerController после загрузки

Вызовите этот метод для изображения перед сохранением его в своей библиотеке.

0 голосов
/ 19 июня 2011

Согласно некоторым сообщениям , приложение iPhone для фотографий в 2009 году вообще не поддерживало зеркальную ориентацию;вполне возможно, что они частично исправили это, но в некоторых случаях все еще имеют ошибки (я знаю, например, что UIImageView неправильно обрабатывает contentStretch в некоторых случаях).Это должно быть достаточно легко проверить: просто загрузите образцы изображений из этого блога в камеру и посмотрите, что получится.

...