我已经尝试过此解决方案CGImage (or UIImage) from a CALayer
但是我没有得到任何东西。
就像问题所说,我试图从相机的预览层获取UIImage。我知道我可以捕获静止图像或使用outputsamplebuffer,但我的会话质量视频设置为照片,所以这两个aproach中的任何一个都很慢,并会给我一个大图像。
所以我认为可以工作的是直接从预览图层获取图像,因为它具有我需要的尺寸,并且已经对其进行了操作。我只是不知道如何让这个图层绘制到我的上下文中,以便我可以将它作为UIImage。
也许另一种解决方案是使用OpenGL直接将这个图层作为纹理?
任何帮助将不胜感激,谢谢。
答案 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。如果您尝试从该视图制作图像,则不会看到任何内容。
我所知道的唯一解决方案是AVCaptureVideoDataOutput
和AVCaptureStillImageOutput
。每个人都有自己的限制。第一个不能与AVCaptureMovieFileOutput
采集同时工作,后者会产生快门噪声。