2011-12-20 47 views
4

我试图在图像上应用一些过滤器。要应用过滤器,我必须先创建一个数组:避免内存异常将过滤器应用于图像(Android)

int[] arr = new int[image.width*image.height];// to store each pixel 

然后我可以将它传递给将应用过滤器的函数。

问题:如果我有超过500KB(约)更大的图像,OOME有没有说我打招呼。

我的尝试:划分满图像分为四个部分以及各部分应用过滤器,并加入他们的行列,但我再次创造int数组时,得到OOME在同一直线上,即。

我不想妥协的图像质量和缩小它。

我真正想要的只是一个提示/逻辑/建筑可在大的图像一样大5 MB ....来处理这个

+0

我想知道过滤图像的方法是什么样子,如果你不介意? – Jave 2011-12-20 09:18:17

+0

正如我告诉你的,应用过滤器不产生OOME,但在应用之前,我需要转换成数组,在这里我得到OOME ...如果你仍然需要看到过滤器代码让我知道,我不介意。 – Farhan 2011-12-20 10:23:54

+0

我对于你在图像上做了什么操作大多好奇。许多简单的操作(如色彩移动等)可以用[ColorMatrix] [1]完成,在这种情况下,您不需要创建新的整数数组。 [1]:http://developer.android.com/reference/android/graphics/ColorMatrix。html – Jave 2011-12-20 10:26:54

回答

1

一种方法上的工作是平铺图像,就像你建议的那样。抓住OOME,并保持瓦的大小减半,直到数组成功分配。

然后按顺序处理每个瓦片,每次重新使用该数组。

+0

他可以根据可用内存计算正确的数组大小,以便在没有OOM的情况下工作。每个位图通常保存宽度*高度* 4个字节。 – 2013-07-24 08:28:39

-1

要回答你的问题,我会考虑它在两个不同的部分。

  1. 如何避免内存不足异常......您可以参考此链接。 There is my answer.

  2. 其次是如果你想显示的图像大到5 MB。你可以尝试有一个缓冲存储。将图像逐块下载,保存到临时文件并保持清除缓存。我自己没有实现它。你可以试试看。

感谢: N_JOY

3

尝试的manifest.xml 使用largeHeap 下应用标签 添加到处理真正的大图像

android:largeHeap = "true" 
+0

我觉得这个属性来自3.0及以上...我正在2.2 – Farhan 2011-12-20 12:03:58

+1

这只适用于某些设备。在某些设备上,这个属性什么都不做。 – 2011-12-21 15:38:58

2

最好的方法是使用JNI。

也许renderscript也可以帮助,但我不知道它的内存限制。