你如何从AVCaptureVideoPreviewLayer获得UIImage?

时间:2012-06-11 09:09:59

标签: ios uiimage avfoundation opengl-es-2.0 calayer

我已经尝试过此解决方案CGImage (or UIImage) from a CALayer

但是我没有得到任何东西。

就像问题所说,我试图从相机的预览层获取UIImage。我知道我可以捕获静止图像或使用outputsamplebuffer,但我的会话质量视频设置为照片,所以这两个aproach中的任何一个都很慢,并会给我一个大图像。

所以我认为可以工作的是直接从预览图层获取图像,因为它具有我需要的尺寸,并且已经对其进行了操作。我只是不知道如何让这个图层绘制到我的上下文中,以便我可以将它作为UIImage。

也许另一种解决方案是使用OpenGL直接将这个图层作为纹理?

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:4)

从此Technical Q&A引用Apple:

  

答:从iOS 7开始,UIView类提供了一种方法   -drawViewHierarchyInRect:afterScreenUpdates :,它允许您将整个视图层次结构的快照呈现为屏幕上可见的   位图上下文。在iOS 6及更早版本中,如何捕获视图的绘图   内容取决于底层绘图技术。这种新方法   -drawViewHierarchyInRect:afterScreenUpdates:使您能够将接收器视图及其子视图的内容捕获到图像   无论绘图技术如何(例如UIKit,Quartz,   OpenGL ES,SpriteKit,AV Foundation等),其中包含视图   呈现

根据我对AVFoundation的体验并非如此,如果您在托管预览图层的视图上使用该方法,则只能获取视图内容而不显示预览图层的图像。使用-snapshotViewAfterScreenUpdates:将返回托管特殊图层的UIView。如果您尝试从该视图制作图像,则不会看到任何内容。
我所知道的唯一解决方案是AVCaptureVideoDataOutputAVCaptureStillImageOutput。每个人都有自己的限制。第一个不能与AVCaptureMovieFileOutput采集同时工作,后者会产生快门噪声。