java - 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);
}
解决方案
图像以 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。
推荐阅读
- java - 在 Mac OS X for Java 应用程序上存储首选项、日志文件、缓存的位置
- python - Python Jupyter Notebook:如何从维基百科十六进制值(如 U+1F0A1)打印 unicode 字符?
- codeigniter - 如何在 CodeIgniter 中通过 URI 删除缓存的网页
- vb.net - 如何在特定列的文本框中获取特定行的值
- javascript - 如何解决 Dropbox Javascript 选择器中的 Malformed Origin 错误
- javascript - Multiple Axios GET requests from different components
- jupyter-notebook - 使用 Colaboratory 在笔记本的文本单元格中插入图像(与笔记本在同一文件夹中)
- python - 将另一列设置为索引后,将数据框的前一个索引保留为一列
- javascript - 给出一个 div 可以回退的默认文本
- javascript - GM.xmlHttpRequest : 无法理解 URL