Android Camera2 API显示已处理的预览图像

rcmalli

新的Camera 2 API与旧的API截然不同。向管道的用户部分显示操纵的相机框架会让我感到困惑。我知道在使用Android L和Camera2 API进行相机预览图像数据处理方面有很好的解释,但显示帧仍然不清楚。我的问题是,在经过一些处理后又在Camera2 api管道中保持效率和速度的同时,如何在屏幕上显示来自ImageReaders回调函数的帧?

流程示例:

camera.add_target(imagereader.getsurface)->在imagereaders回调上进行一些处理->(在屏幕上显示已处理的图像?)

解决方法:每次处理新帧时,将位图发送到imageview。

埃迪·塔尔瓦拉(Eddy Talvala)

在澄清问题后进行编辑;底部的原始答案

取决于您在哪里进行处理。

如果使用的是RenderScript,则可以将Surface从SurfaceView或TextureView连接到Allocation(使用setSurface),然后将处理后的输出写入该Allocation并通过Allocation.ioSend()发送出去。HDR取景器的演示使用了这种方法。

如果您正在执行基于EGL着色器的处理,则可以使用eglCreateWindowSurface将Surface连接到EGLSurface,并将Surface作为native_window参数。然后,您可以将最终输出呈现到该EGLSurface上,并在调用eglSwapBuffers时将缓冲区发送到屏幕。

如果您正在执行本机处理,则可以使用NDK ANativeWindow方法写入从Java传递的Surface并将其转换为ANativeWindow。

如果您正在执行Java级处理,那确实很慢,并且您可能不想这样做。但是可以使用新的Android M ImageWriter类,或每帧将纹理上载到EGL。

或者如您所说,每帧绘制到一个ImageView,但这会很慢。


原始答案:

如果要捕获JPEG图像,则可以简单地将ByteBuffer的内容从复制Image.getPlanes()[0].getBuffer()到中byte[],然后用于BitmapFactory.decodeByteArray将其转换为位图。

如果要捕获YUV_420_888图像,则需要将自己的转换代码从3平面YCbCr 4:2:0格式编写为可以显示的内容,例如RGB值的int []以从中创建位图。不幸的是,目前还没有方便的API。

如果要捕获RAW_SENSOR图像(Bayer模式未处理的传感器数据),则需要进行大量图像处理或仅保存DNG。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章