AvcaptureMovieLileOutput, вызывая неправильную ориентацию при сохранении фото на рулон с камерой
-
28-10-2019 - |
Вопрос
У меня есть странная проблема с 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 Результат Ориентация изображения после загрузки
Назовите этот метод на изображении, прежде чем сохранить его в библиотеке.