4

我已经从 CALayer 尝试过这个解决方案 CGImage(或 UIImage)

但是我什么也没得到。

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

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

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

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

4

1 回答 1

4

从这个技术问答中引用苹果:

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

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

于 2014-03-06T09:17:27.863 回答