Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓摄像头在onPictureTaken中设置PictureFormat和数据数组_Android_Android Camera - Fatal编程技术网

Android 安卓摄像头在onPictureTaken中设置PictureFormat和数据数组

Android 安卓摄像头在onPictureTaken中设置PictureFormat和数据数组,android,android-camera,Android,Android Camera,您好,我刚刚编写了一个Android应用程序,它从摄像头中获取图像,我想知道摄像头参数方法setPictureFormat()的实际功能以及它的影响。据我所知,camera.takePicture()实际上只在JPEG回调中提供数据。所以我认为到达onPictureTaken()的数据数组无论如何都是JPEG数据?例如,为什么我要将此参数设置为PixelFormat.RGB_565?是否有任何方法可以直接解释onPictureTaken()中的数据数组,例如BitmapFactory.decod

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

方法将像素格式应用于传递给
takePicture()
的原始和后期视图回调中返回的字节数组。正如文档中提到的,这些回调甚至可能不会发生在没有缓冲区支持的硬件上,但如果确实发生,数据将根据此设置进行格式化。JPEG回调将已压缩为JPEG格式的数据传回,这是正确的

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

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

希望有帮助