新的 Camera 2 API 与旧的有很大不同。向管道的用户部分显示操纵的相机帧让我感到困惑。我知道有很好的解释使用 Android L 和 Camera2 API 处理相机预览图像数据但显示帧仍然不清楚。我的问题是,在经过一些处理后,在屏幕上显示来自 ImageReaders 回调函数的帧,同时保持 Camera2 api 管道的效率和速度的方式是什么?
流程示例:
camera.add_target(imagereader.getsurface) -> 在 imagereaders 回调上进行一些处理 -> (在屏幕上显示处理后的图像?)
解决方法想法:每次处理新帧时将位图发送到 imageview。
澄清问题后进行编辑;原答案在底部
取决于您在哪里进行处理。
如果您使用 RenderScript,则可以将 Surface 从 SurfaceView 或 TextureView 连接到分配(使用设置曲面),然后将处理后的输出写入该 Allocation 并使用 Allocation.ioSend() 将其发送出去。这HDR 取景器演示使用这种方法。
如果您正在进行基于 EGL 着色器的处理,则可以使用以下命令将 Surface 连接到 EGLSurfaceegl创建窗口表面,将 Surface 作为 native_window 参数。然后,您可以将最终输出渲染到 EGLSurface,并且当您调用 eglSwapBuffers 时,缓冲区将被发送到屏幕。
如果您正在进行本机处理,则可以使用 NDKANativeWindow 方法写入从 Java 传递的 Surface 和convert到 ANativeWindow。
如果您正在进行 Java 级别的处理,那么速度非常慢,而且您可能不希望这样做。但可以使用新的Android M图像编辑器类,或者每帧将纹理上传到 EGL。
或者正如您所说,每帧绘制到 ImageView,但这会很慢。
原答案:
如果您正在捕获 JPEG 图像,您可以简单地从以下位置复制 ByteBuffer 的内容:Image.getPlanes()[0].getBuffer()
into a byte[]
,然后使用BitmapFactory.decodeByteArray
将其转换为位图。
如果您要捕获 YUV_420_888 图像,那么您需要编写自己的转换代码,从 3 平面 YCbCr 4:2:0 格式转换为您可以显示的格式,例如用于创建位图的 RGB 值的 int[] ;不幸的是,目前还没有一个方便的 API 来实现这一点。
如果您正在捕获 RAW_SENSOR 图像(拜耳模式未处理的传感器数据),那么您需要进行大量图像处理或仅保存 DNG。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)