GPUImageStillCamera输出分辨率有限

时间:2013-05-05 19:52:20

标签: ios ipad gpuimage

在带有iOS 6.1的iPad 3 Retina上,我用以下内容初始化我的静态相机

stillCamera = [[GPUImageStillCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionBack];
stillCamera.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;

我使用这些过滤器设置相机:

UIImage *inputImage = [UIImage imageNamed:@"blank-1x1.png"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture processImage];

chromaKeyBlendFilter = [[GPUImageChromaKeyBlendFilter alloc] init];
[chromaKeyBlendFilter setColorToReplaceRed:0.0 green:1.0 blue:0.0];
[chromaKeyBlendFilter setThresholdSensitivity:0.37f];
filter = chromaKeyBlendFilter;

[stillCamera addTarget:filter];
[sourcePicture addTarget:filter];

[filter addTarget:videoPreviewView]; // 1024x768 view
[stillCamera startCameraCapture];

当我拍摄我使用的图像时:

[stillCamera capturePhotoAsPNGProcessedUpToFilter:filter withCompletionHandler:^(NSData *processedPNG, NSError *error){
    self.currentImage = [UIImage imageWithData:processedPNG];
});

但我得到的图像是屏幕尺寸(Retina风格)2048x1536,而不是我对后置摄像头的预期2420x1936。我还注意到#imageFromCurrentlyProcessedOutputWithOrientation#也只返回屏幕大小并查看GPUImageStillCamera.m中的捕获代码,看起来好像是输出源自的地方。

我不知道为什么,因为我还有一个选项/按钮来使用非GPUImage设置,我得到了2420x1936的PNG图像。

我在这里做错了什么?感谢您的任何提示(因为我真的想要2420x1936)。

1 个答案:

答案 0 :(得分:0)

首先,我的意思是2592x1936用于iPad后置摄像头的全分辨率(我裁剪的图像为8x10尺寸)。事实证明,我试图太“聪明”。

当我点击按钮捕获图像时,我在后台线程中使用以下内容来获取在异步捕获时保存到属性的图像(在这种情况下,PNG文件最多可达8mb)

[stillCamera capturePhotoAsPNGProcessedUpToFilter:filter withCompletionHandler:^(NSData *processedPNG, NSError *error)
self.currentImage = [UIImage imageWithData:processedPNG];

但是,在调度该队列后,我立即进入预览视图,在那里我使用

抓取图像
[filter imageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationUp]

那是2048x1516,足以在iPad Retina上显示预览。然后,当该预览被取消时,self.currentImage被裁剪并保存到文件(和Core Data元数据)。

当我太“聪明”的时候,当我注意到预览显示时,我仍然从相机中获取记录的KVO控制台消息。所以,在viewWillDisappear中,我放入了一个“暂停相机”并重新出现“恢复相机”。显然,当发出暂停摄像头命令时,它立即停止处理并将其具有的内容转储到我的currentImage属性,并且如果预览可能已经等了几秒钟,那么它总是一个2048x1516的图像而不是全分辨率图像。

恕我直言,当相机暂停时,任何背景捕捉线程都应该继续,直到完成,然后暂停相机。但我可以解决这个问题,我很高兴找到了这个问题。