【问题标题】:Android Camera setPictureFormat and data array in onPictureTakenAndroid Camera setPictureFormat 和 onPictureTaken 中的数据数组
【发布时间】:2011-11-18 23:18:52
【问题描述】:

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

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

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

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

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

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 2011-05-20
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多