我使用本教程学习并尝试理解如何使用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);
}
2条答案
按热度按时间vx6bjr1n1#
变量
bytes
包含一个完整的压缩jpeg文件。你需要解压它来做任何事情,比如bitmapfactory.decodebytearray或imagedecoder(更新的api级别)。它不是任何意义上的rgb值的未压缩数组。如果需要未压缩的数据,camera api支持
YUV_420_888
格式,它将为您提供未压缩的4:2:0 yuv数据;但仍然不是rgb。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。