onPictureTaken中的Android Camera setPictureFormat和数据数组

时间:2011-11-18 23:18:53

标签: android android-camera

您好我刚刚写了一个小应用程序,它从相机中获取图像,并想知道相机参数方法setPictureFormat()实际上做了什么以及它有什么影响。据我所知,camera.takePicture()实际上只提供JPEG回调中的数据。所以我认为到达onPictureTaken()的数据数组无论如何都是JPEG数据?那么我为什么要将此参数设置为PixelFormat.RGB_565呢?有没有办法直接在onPictureTaken()中直接解释数据数组,例如BitmapFactory.decodeByteArray?我发现相当奇怪的是,我得到的图像的分辨率为2448 * 3264,总共对应7990272像素。然而,创建该图像的基础数据aray仅具有大约2000000像素的长度。如果有人能为我澄清这一点,我将不胜感激。

1 个答案:

答案 0 :(得分:10)

setPictureFormat()方法应用传递给takePicture()的raw和postView回调中返回的字节数组的像素格式。正如文档所提到的,这些回调甚至可能不会发生在没有缓冲区来支持它的硬件上,但是如果它们确实发生了,那么数据将根据这个设置进行格式化。你是正确的,JPEG回调将已压缩的数据传回JPEG格式。

在您的示例中,原始字节数组的大小将根据所选的像素格式而有所不同。你是对的,2448 * 3264 = 7,990,272像素,但每个像素由数组中的多个字节表示。例如,像NV16或RGB_565这样的格式具有16位(2字节)来表示每个像素。这意味着实际的原始字节数组长度为15,980,554(~15MB),这是一次非常大量的数据存储在内存中(这几乎是原始G1的整个堆大小)。这就是为什么并非所有设备都缓冲并返回原始图像数据的原因。

当您检查JPEG回调中返回的数据长度时,您正在查看压缩的JPEG图像数据,该数据不再是原始位图图像。因此,结果会小得多。如果您要将此JPEG图像数据膨胀回Bitmap(例如,使用BitmapFactory),则大小会再次膨胀。请记住这一点,因为大小的图像作为ARGB_8888位图(每像素4个字节)加载到内存中将消耗~32MB。这是代码中OutOfMemoryException的简单方法。

希望有帮助!