我想对原始图像进行图像处理而不将其显示在屏幕上,这显然会降低性能。

根据对该线程Taking picture from camera without preview的回答,在Android 1.5中是不可能的,但是有人知道在Android 4(API级别15)中是否可行?

最佳答案

在Android 4中,最简单的接收原始图像数据而不在屏幕上显示的方法是使用Camera.setPreviewTexture()调用将预览帧路由到GPU。

您可以通过两种方式使用它:

  • 在GPU上进行实际处理:设置OpenGL上下文(OpenGL ES 2 tutorial),并在该上下文中创建SurfaceTexture对象。然后将该对象传递给setPreviewTexture,然后开始预览。然后,在您的OpenGL代码中,您可以调用SurfaceTexture.updateTexImage,并且与SurfaceTexture关联的纹理ID将更新为相机的最新预览帧。如果需要,还可以使用glReadPixels将RGB纹理数据读回CPU,以进行进一步处理。
  • 在CPU上进行处理:您可以简单地创建一个虚拟SurfaceTexture对象,而无需设置任何OpenGL上下文。传递所需的任何整数作为纹理ID,然后使用setPreviewTexture将SurfaceTexture连接到相机。只要您不调用updateTexImage,SurfaceTexture就会简单地丢弃相机传递给它的所有数据。然后,使用setPreviewCallback设置预览回调,并将该数据(通常为YUV格式)用于CPU处理。这可能比#1效率低,但不需要了解OpenGL。
  • 10-08 03:39