使用ImageReader读取RGB图像

nne*_*neo 18 android android-camera

我正在尝试用来ImageReader从相机中获取RGB图像.我在运行开发者预览版的Nexus 5上使用Android 5.0"L"的Camera2 API.

我已经SurfaceView配置了RGB图像,工作正常,我知道相机硬件产生RGB数据(因为Android上的所有色调映射和颜色增益设置都指定在RGB通道上运行).

我可以通过以下方式创建ImageReader从ImageReader获取YUV_420_888图像:

imageReader = ImageReader.newInstance(W, H, ImageFormat.YUV_420_888, 4);
Run Code Online (Sandbox Code Playgroud)

然后将YUV图像转换为RGB.然而,这引入了不希望的量化误差(因为我的应用需要RGB图像)和不必要的处理时间.

但是,当我尝试以这种方式创建图像阅读器时:

imageReader = ImageReader.newInstance(W, H, PixelFormat.RGB_888, 4);
Run Code Online (Sandbox Code Playgroud)

图像捕获失败,但出现以下异常:

java.lang.UnsupportedOperationException: The producer output buffer format 0x22 doesn't match the ImageReader's configured buffer format 0x3.
        at android.media.ImageReader.nativeImageSetup(Native Method)
        at android.media.ImageReader.acquireNextSurfaceImage(ImageReader.java:293)
        at android.media.ImageReader.acquireNextImage(ImageReader.java:339)
        at android.media.ImageReader.acquireLatestImage(ImageReader.java:243)
        at <my code...>
Run Code Online (Sandbox Code Playgroud)

我在两条战线上感到困惑.首先,提到的输出格式0x22不在PixelFormat或ImageFormat中.它似乎是某种未记录的原始模式,但我不能ImageReader.newInstance(W, H, 0x22, 4)用来捕获它(我得到java.lang.UnsupportedOperationException: Invalid format specified 34).我希望以原始格式捕获,但我不能说服ImageFormat接受它(并且由于ImageFormat.RAW_SENSOR某种原因,其他原始格式非常慢).

其次,SurfaceView已经很乐意消费RGB_888图像(据我所知),并将它们直接放在屏幕上.那么为什么不能ImageReader正确接受RGB图像呢?我做错了什么?

小智 -1

错误异常是因为 与PixelFormat.RGB_888不一样ImageFormat.RGB_888

PixelFormat.RGB_888就相当于ImageFormat.RGB_565不是你用的那个ImageFormat.RGB_888

你必须使用ImageFormat.RGB_888而不是PixelFormat.RGB_888像这样:

imageReader = ImageReader.newInstance(W, H, ImageFormat.RGB_565, 4);
Run Code Online (Sandbox Code Playgroud)

这允许使用从相机捕获RGBImageReader