2011-12-20 99 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也可以幫助,但我不知道它的內存限制。