【问题标题】:Android high resolution image processingAndroid高分辨率图像处理
【发布时间】:2012-01-29 08:29:27
【问题描述】:

从实验和阅读其他帖子like this one 看来,在 Android 上处理高分辨率图像似乎很困难,因为 VM 允许分配的内存量是有限的。

加载 8MP 相机图片需要大约 20 MB 内存。

我知道简单的解决方案是在加载图像时对图像进行下采样(BitmapFactory 提供了这样的选项),但我仍然想以全分辨率处理图像:相机拍摄 8MP,为什么我只使用 4MP 并减少质量。

有没有人知道很好的解决方法?

【问题讨论】:

    标签: android image image-processing bitmap out-of-memory


    【解决方案1】:

    在资源受限的环境中,我认为您唯一的解决方案是分而治之:例如缓存/平铺(如:瓷砖)

    您不是一次性加载和处理图像,而是从原始数据文件加载/保存可管理的图像块来进行处理。这不是微不足道的,并且可能会变得非常复杂,具体取决于您要执行的处理类型,但如果您不想影响图像质量,这是唯一的方法。

    【讨论】:

    • 我想过平铺。它使图像处理更加复杂,但主要缺点是最后我需要重建最终文件,该文件将来自大量临时文件。这可能是可行的,但很重。
    • 如果您的图像尺寸在处理过程中没有改变,那么您就不需要临时文件。您可以将已处理的部分/图块写入图像文件的适当部分。
    • 对。我担心所有 IO 的处理时间都很糟糕。知道写入闪存与手机 RAM 相比要慢多少吗?
    【解决方案2】:

    确实,这很难。但是如果图像是某种连续的光栅格式,你可以映射它 (请参阅 java.nio.ByteBuffer ) - 这样您就可以在不分配字节缓冲区的情况下获得它。

    【讨论】:

      【解决方案3】:

      两件事:

      1. 查看 Honeycomb 中的画廊。它执行这种基于平铺的渲染。您可以放大图像,然后您会看到当前部分的分辨率高于其他部分。如果你平移你会看到它正在渲染。

      2. 使用本机代码 (NDK) 时,没有资源限制。因此,您可以尝试加载所有本地数据并以某种方式使用 JNI 获取其中的一部分,但我怀疑它是否比 Honeycom 的画廊更好。

      【讨论】:

      • 关于 1. BitmapFactory 确实被设计为做这样的事情:只加载一个区域,以较低的分辨率加载。像@paul-sasik 建议的那样,加载区域可能有助于实现平铺。
      • 关于 2. 同样的限制适用于本机代码。我在渲染事物时遇到原生 OutOfMemory 错误。
      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2013-08-25
      • 2017-08-23
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多