2012-06-11 60 views
4

我已经试过这个解决方案CGImage (or UIImage) from a CALayer如何从AVCaptureVideoPreviewLayer获取UIImage?

但是我什么都没得到。

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

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

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

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

+0

预览CALayer将CIImage参考存储在内容属性中。 –

回答

3

从报价苹果这个Technical Q&A

答:从iOS的7起,UIView类提供了一种方法 -drawViewHierarchyInRect:afterScreenUpdates:,它可以让你渲染整个视图层次结构为可见屏幕上的快照放入一个 位图上下文中。在iOS 6及更早版本中,如何捕获视图的图形 内容取决于底层的绘图技术。这个新方法 -drawViewHierarchyInRect:afterScreenUpdates:使您能够捕获接收者视图的内容及其对图像的子视图 无论绘图技术如何(例如UIKit,Quartz,OpenGL ES,SpriteKit,AV Foundation等)该观点被渲染

在我关于AVFoundation经验 是不是这样的,如果你使用的方法上认为主机的预览层,你将只能获得视图的内容,而不预览层的图像。使用-snapshotViewAfterScreenUpdates:将返回一个托管特殊图层的UIView。如果您尝试从该视图制作图像,则不会看到任何内容。
我知道的唯一解决方案是AVCaptureVideoDataOutputAVCaptureStillImageOutput。每个人都有自己的限制。第一个不能与AVCaptureMovieFileOutput采集同时工作,后者会产生快门噪音。