示例流程:
camera.add_target(imagereader.getsurface) – >在图像读取器上回调做一些处理 – > (在屏幕上显示已处理的图像?)
解决方法创意:每次处理新帧时,都会将位图发送到imageview.
解决方法
取决于您在哪里进行处理.
如果您正在使用RenderScript,则可以将Surface从SurfaceView或TextureView连接到分配(使用setSurface),然后将处理后的输出写入该分配并使用Allocation.ioSend()将其发送出去. HDR Viewfinder demo使用这种方法.
如果您正在进行基于EGL着色器的处理,则可以使用eglCreateWindowSurface将Surface连接到EGLSurface,将Surface作为native_window参数.然后,您可以将最终输出渲染到该EGLSurface,当您调用eglSwapBuffers时,缓冲区将被发送到屏幕.
如果您正在进行本机处理,则可以使用NDK ANativeWindow methods写入从Java和convert传递到ANativeWindow的Surface.
如果你正在进行Java级处理,那真的很慢而且你可能不想这样做.但是可以使用新的Android M ImageWriter类,或者每帧上传一个纹理到EGL.
或者如您所说,每帧都绘制一个ImageView,但这样会很慢.
原始答案:
如果要捕获JPEG图像,只需将ByteBuffer的内容从Image.getPlanes()[0] .getBuffer()复制到byte []中,然后使用BitmapFactory.decodeByteArray将其转换为Bitmap.
如果您正在捕获YUV_420_888图像,那么您需要将自己的转换代码从3平面YCbCr 4:2:0格式写入您可以显示的内容,例如RGB []的RGB值来创建位图;遗憾的是,还没有一个方便的API.
如果您正在捕获RAW_SENSOR图像(拜耳模式未处理的传感器数据),那么您需要进行大量图像处理或只需保存DNG.