【问题标题】:get pixels from jpeg byte array从 jpeg 字节数组中获取像素
【发布时间】:2013-01-30 18:21:55
【问题描述】:

我需要在不实例化位图的情况下从 Jpeg 图像中获取像素信息,然后将其传递给 JNI。

android 无法从相机中获取除 jpeg 图像之外的任何其他内容(除非您需要低分辨率,在这种情况下您可以使用PreviewCallback),所以我从 jpegCallback 中获取了 byte[]。

是否可以在不使用Bitmap.getPixels() 的情况下获取int[] 中的像素信息?

【问题讨论】:

  • 既然您试图避免 Java 的内存限制并将图像传递给 JNI,为什么不使用本机代码对其进行解码呢?在这种情况下,您将不会有 2 个图像副本,并且可以避免将其传递给 JNI 所浪费的时间。

标签: android bitmap java-native-interface jpeg pixel


【解决方案1】:

如果您不想构建位图,您唯一的选择是自己解码 JPEG 缓冲区;这意味着要么找到另一个 Java JPEG 解压缩库,要么使用 JNI 和 C JPEG 库,例如 libjpeg。或者,您可以从头开始编写一个,除非您已经非常熟悉图像压缩例程,并且您有足够的时间进行实施和调试,否则我不建议您这样做。

正如 Scott 所问,为什么使用 Bitmap 是不可接受的?无论您采用哪种方式,您都必须调用一些东西来解压缩图像数据,而使用BitmapFactory.decodeByteArray 是一个简单明了的已知工作选项。

【讨论】:

    【解决方案2】:

    我看不出使用标准 Android API 是如何实现的。我确定您可以使用第 3 方 JPEG 库(谷歌搜索可能会发现)。你为什么要避免位图?如果是内存限制,您可能希望使用 BitmapRegionDecoder 解码小的水平块

    【讨论】:

    • BitmapRegionDecoder 是我目前选择的,但由于我需要分配一个int[],我仍然需要对图片进行下采样,避免出现 outOfMemoryException,这对于jni
    • 获得位图后,您可以将其传递到本机代码中,并使用 NDK 的位图访问函数直接从中读取像素。这样,您根本不必在 Java 代码中分配 int[]。文档在NDK本身,不在网上任何地方,但大致需要用到jnigraphics库,它提供了c函数来锁定和访问位图对象。
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2016-05-18
    • 1970-01-01
    • 2013-10-08
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多