AvcaptureMovieLileOutput, вызывая неправильную ориентацию при сохранении фото на рулон с камерой

StackOverflow https://stackoverflow.com/questions/6351642

Вопрос

У меня есть странная проблема с CapturestillimageAsynchronyfromconnection. Если я сохраняю изображение, используя 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];
                                                             }
                                                         }];
}
Это было полезно?

Решение

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

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

Другие советы

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

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

Назовите этот метод на изображении, прежде чем сохранить его в библиотеке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top