首页 > 解决方案 > Android Camera2 API 图像色彩空间

问题描述

我使用本教程学习并尝试了解如何使用 Camera2 API 制作简单的拍照 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);
      }

标签: javaandroidandroid-camera2

解决方案


图像以 JPEG 格式(在第一行中指定)接收。Android 对 JPEG 使用 YUV(更准确地说,YCbCr)颜色空间。Jpeg 大小是可变的,它使用有损压缩进行压缩,您几乎无法控制压缩级别。

通常,您会在onImageAvailable()中收到一个 JPEG 缓冲区,然后将此 JPEG解码以接收一个Bitmap。您可以将此 Bitmap 的像素作为打包SRGB像素的 int 数组获取。该数组的格式ARGB_8888。您不需要 JNI 将其转换为 BGR,请参阅此答案

您可以从 C++ 访问位图对象,请参阅ndk/reference/group/bitmap。在那里你可以找到这个位图的像素格式。如果它是从 JPEG 解码的,您应该期望它是ANDROID_BITMAP_FORMAT_RGBA_8888


推荐阅读