android camera2 api图像颜色空间

bq3bfh9z  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(609)

我使用本教程学习并尝试理解如何使用camera2api制作一个简单的android拍照应用程序。我已经添加了一些代码片段,看看你们是否都能帮助我理解一些问题。
我试图找出如何将图像保存为。是rgb还是bgr?它是否存储在变量字节中?

ImageReader reader = ImageReader.newInstance(width,height,ImageFormat.JPEG, 1);

@Override
public void onImageAvailable(ImageReader reader) {
      Image image = null;
      try {
            image = reader.acquireLatestImage();
            ByteBuffer buffer = image.getPlanes()[0].getBuffer();
            byte[] bytes = new byte[buffer.capacity()];
            buffer.get(bytes);
            save(bytes);
      }
vx6bjr1n

vx6bjr1n1#

变量 bytes 包含一个完整的压缩jpeg文件。你需要解压它来做任何事情,比如bitmapfactory.decodebytearray或imagedecoder(更新的api级别)。
它不是任何意义上的rgb值的未压缩数组。如果需要未压缩的数据,camera api支持 YUV_420_888 格式,它将为您提供未压缩的4:2:0 yuv数据;但仍然不是rgb。

mzaanser

mzaanser2#

图像以jpeg格式接收(如第一行中所指定)。android使用yuv(更确切地说,ycbcr)颜色空间来表示jpeg。jpeg大小是可变的,它是用有损压缩进行压缩的,并且您对压缩级别几乎没有控制权。
通常,您会在onimageavailable()中接收一个jpeg缓冲区,并对该jpeg进行解码以接收位图。可以将此位图的像素作为压缩的srgb像素的int数组。此数组的格式为argb\u 8888。您不需要jni将其转换为bgr,请看这个答案。
可以从c++访问位图对象,请参见ndk/reference/group/bitmap。在那里你可以找到这个位图的像素格式。如果它是从jpeg解码的,你应该认为这是android位图格式的rgba 8888。

相关问题