我正在尝试使用ImageReader
从相机获取 RGB 图像。我在运行开发者预览版的 Nexus 5 上使用 Android 5.0“L”中的 Camera2 API。请注意,我是not询问如何将 YUV 转换为 RGB - 我正在尝试直接从ImageReader
。对于任何想知道如何将 YUV 转换为 RGB 的人,请随时咨询另一个问题,例如将Androidcamera2 api YUV_420_888转换为RGB https://stackoverflow.com/questions/30510928/convert-android-camera2-api-yuv-420-888-to-rgb.
我已经有一个SurfaceView
配置为 RGB 图像,工作正常,并且我相信相机硬件会生成 RGB 数据(因为 Android 上的所有色调映射和颜色增益设置都指定为在 RGB 通道上操作)。
我可以通过以下方式创建 ImageReader 从 ImageReader 获取 YUV_420_888 图像:
imageReader = ImageReader.newInstance(W, H, ImageFormat.YUV_420_888, 4);
然后将YUV图像转换为RGB图像。然而,这会引入不必要的量化误差(因为我的应用程序需要 RGB 图像)和不必要的处理时间。
但是,当我尝试以这种方式创建图像读取器时:
imageReader = ImageReader.newInstance(W, H, PixelFormat.RGB_888, 4);
图像捕获失败,但出现以下异常:
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...>
我在两个方面感到困惑。首先,提到的输出格式 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 图像?我做错了什么?