5

我对 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];
                                                             }
                                                         }];
}
4

3 回答 3

2

我想知道你新创建的图像是否真的像你在这里假设的那样设置了它的方向:

[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:时候实际上只包含图像像素数据本身?

于 2011-06-24T06:15:16.347 回答
0

根据一些报道,2009 年 iPhone 的照片应用程序根本不支持任何镜像方向。他们当然有可能部分修复了这个问题,但在某些情况下仍然存在错误(例如,我知道 UIImageViewcontentStretch在某些情况下无法正确处理)。这应该很容易测试:只需将该博客中的示例图像加载到相机胶卷中,看看会发生什么。

于 2011-06-19T19:30:55.273 回答
0

上传后创建iOS UIImagePickerController 结果图像方向中描述的UIImage 类别

在将图像保存到您的库之前,请在图像上调用此方法。

于 2011-06-20T16:36:12.143 回答