AVCaptureStillImageOutput图像返回颠倒

时间:2014-03-16 01:13:48

标签: ios avcapture

我正在使用captureStillImageAsynchronouslyFromConnection

从相机捕捉图像

图像被颠倒保存。我尝试使用

保存图像
UIImage *flippedImage = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUp]

但此方向仅在元数据中,当我从文件中复制数据以处理它时,处理后的图像是颠倒的。 (快速查看原件竖立,但处理/过滤的图像是颠倒的。)

设置视频捕捉方向的正确方法是什么?

我在视频预览图层上设置了方向,但这不会影响AVCaptureStillImageOutput对象缓冲区中捕获的数据。

我读了AVCaptureStillImageOutput标题,但似乎没有解释如何强制相机预览图像缓冲区的方向。

e.g。 - (AVMetadataObject *)transformedMetadataObjectForMetadataObject:(AVMetadataObject *)metadataObject connection:(AVCaptureConnection *)connection NS_AVAILABLE_IOS(6_0);

由于

2 个答案:

答案 0 :(得分:4)

“问题”是图像方向,iOS相机仅在一个方向上返回图像,除非您设置了已转换图像的-videoOrientation属性。所以可能存在不同的问题:

  1. videoOrientation未正确设置
  2. videoOrientation未设置为全部
  3. videoOrientation属性仅适用于静止图像和视频捕获,而不适用于单个缓冲区 此代码段来自Apple AVCam示例代码。

        [[[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo] setVideoOrientation:[[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] connection] videoOrientation]];
    
        [AVCamViewController setFlashMode:AVCaptureFlashModeAuto forDevice:[[self videoDeviceInput] device]];
    
        [[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:[[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo] completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
    
            if (imageDataSampleBuffer)
            {
                NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
                UIImage *image = [[UIImage alloc] initWithData:imageData];
                [[[ALAssetsLibrary alloc] init] writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)[image imageOrientation] completionBlock:nil];
            }
        }]; <br>
    

    首先,它根据预览视图设置方向,稍后拍摄,然后将其保存在资源库中,方向正确

答案 1 :(得分:0)

正如您所提到的,通过这样做,您只需更改元数据。 您需要使用此方法来实际翻转图像。

试试这个:

- (UIImage *)flipImage:(UIImage *)image
{
    UIGraphicsBeginImageContext(image.size);
    CGContextDrawImage(UIGraphicsGetCurrentContext(),CGRectMake(0, 0, image.size.width, image.size.height),image.CGImage);
    UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return i;
}

更多信息here