我正在操纵相对较大的图像,大约500万像素,有时甚至更多。我需要在内存中复制两张图像进行操作。 现在,加载的图像消耗大量内存,超过默认Android堆可用的内存,分别为16MB和24MB,导致以下错误:
11-20 18:02:28.984:E / AndroidRuntime(7334): java.lang.OutOfMemoryError:位图大小超过VM预算
我需要全分辨率,因此在加载图像时缩小尺寸无济于事。 解决这个问题的最佳解决方案是什么?是否有内置方法从存储中动态加载大块位图?有人可以给我一些提示,告诉我如何克服记忆问题,例如:通过使用特定的缓存策略?
此致
答案 0 :(得分:1)
您可以在ndk中分配更多内存。您必须编写本机代码来操作图像,或者您必须找到一种方法来分配本机中的图像内存,然后将其传递回Java。
另一种选择可能是将单个图像加载到内存中,然后将其分解为块以进行处理。将这些块保存到文件系统中。所以,说你2张大图。您加载第一个图像,将其分成4个部分,保存它们,加载第二个图像,将其分成4个部分,保存它们,然后为每个图像加载第1部分,然后执行您的操作。这意味着您知道单个图像都不比堆最大值大,并且您需要做的是(基本上)像素级别并且不需要访问周围的像素数据(如果您在边缘处遇到麻烦)需要邻居像素信息)。
如果没有缩减,分割或ndk,我不知道你如何将更多的图像数据存入内存。也许降低颜色信息。我们在产品中这样做。将每个像素表示为16位而不是24位或32位。我们的产品功能强大而不是“漂亮”,所以颜色信息的丢失并不是什么大问题。
答案 1 :(得分:1)
您应该观看有关内存管理的视频:http://www.youtube.com/watch?v=_CruQY55HOk 在大约6分钟后,他将覆盖添加到HoneyComb的LargeHeap清单选项。