Android 安卓摄像头在onPictureTaken中设置PictureFormat和数据数组
您好,我刚刚编写了一个Android应用程序,它从摄像头中获取图像,我想知道摄像头参数方法setPictureFormat()的实际功能以及它的影响。据我所知,camera.takePicture()实际上只在JPEG回调中提供数据。所以我认为到达onPictureTaken()的数据数组无论如何都是JPEG数据?例如,为什么我要将此参数设置为PixelFormat.RGB_565?是否有任何方法可以直接解释onPictureTaken()中的数据数组,例如BitmapFactory.decodeByteArray?我觉得很奇怪的是,我得到了一个分辨率为2448*3264的图像,对应于7990272个像素。然而,创建此图像的基础数据aray只有大约2000000像素的长度。如果有人能为我澄清这一点,我将不胜感激。方法将像素格式应用于传递给Android 安卓摄像头在onPictureTaken中设置PictureFormat和数据数组,android,android-camera,Android,Android Camera,您好,我刚刚编写了一个Android应用程序,它从摄像头中获取图像,我想知道摄像头参数方法setPictureFormat()的实际功能以及它的影响。据我所知,camera.takePicture()实际上只在JPEG回调中提供数据。所以我认为到达onPictureTaken()的数据数组无论如何都是JPEG数据?例如,为什么我要将此参数设置为PixelFormat.RGB_565?是否有任何方法可以直接解释onPictureTaken()中的数据数组,例如BitmapFactory.decod
takePicture()
的原始和后期视图回调中返回的字节数组。正如文档中提到的,这些回调甚至可能不会发生在没有缓冲区支持的硬件上,但如果确实发生,数据将根据此设置进行格式化。JPEG回调将已压缩为JPEG格式的数据传回,这是正确的
在您的示例中,原始字节数组的大小将根据选定的像素格式而变化。您是对的,2448*3264=7990272像素,但每个像素都由数组中的字节数表示。例如,像NV16或RGB_565这样的格式有16位(2字节)来表示每个像素。这意味着实际的原始字节数组长度将是15980554(~15MB),这是一次存储在内存中的大量数据(这几乎是原始G1的整个堆大小)。这就是为什么不是所有设备都缓冲并返回原始图像数据
检查JPEG回调中返回的数据长度时,您看到的是压缩的JPEG图像数据,它不再是原始位图图像。因此,结果会小得多。如果要将此JPEG图像数据膨胀回位图(例如,使用BitmapFactory),则大小将再次膨胀。记住这一点,作为一个ARGB_8888位图(每像素4字节)加载到内存中的图像大小将消耗约32MB的内存。这是在代码中实现OutOfMemoryException的简单方法
希望有帮助