2011-06-16 53 views
0

我讀了很多關於inSampleSize OutOfMemory困境的討論。
不能得到一個好的解決方案,所以我問一個關於它的問題。
我目前正在加載一個位圖inSampleSize = 4。
這將給我一個大小爲648x388的位圖。
原始磁盤大小爲2592x1592。我在648x388位圖上寫文本並將其保存回磁盤。
我寫在648x388因爲2592x1592給我OutOfMemory。android如何加載/保存原始大小位圖沒有OutOfMemory

它的工作方式是可以將1-10個648x388位圖保存在while循環中。
我想改變這個循環來保存1-10 2592x1592位圖。

我該如何安全地加載2592x1592?
我不在乎分辨率下降60%或更多。
只要位圖具有相同的大小2592x1592。
有沒有一種方法可能會保持大小,但使位圖變薄,
去除顏色沒有使質量不好。

我首先想到的是要像這樣的東西來獲得最大的位圖我能得到: 我沒有測試過這一點,但得到的感覺這是一個糟糕的方式

boolean work = true; 
int insample = 2; 
BitmapFactory.Options options = new BitmapFactory.Options(); 
while(work){ 
    try{ 
    options.inSampleSize = insample; 
     bitmap = BitmapFactory.decodeFile(filePath,options); 
     work = false; 
    }catch(Exception e){ 
     insample++; 
    } 
} 

任何幫助將是篦。

回答

2

圖像處理需要大量的內存。你不能使用整個位圖,只需在你的手機上修改它。爲此,使用Web服務。上傳,處理,下載。對不起,沒有其他方式解碼位圖只需要很多內存。

順便說一句,你不能捕捉outOFMemory異常。該應用程序只是崩潰。

+0

謝謝@DArkO的回答。有趣的..如果我不能使用Web服務有一些方法來使位圖變薄,但保持相同的大小2592x1592。無論如何,我猜想我必須加載它,並擊中OOM。 – Erik 2011-06-16 18:21:57

+0

分辨率實際上是一個位圖中有多少像素(一個維度是指單個線寬和多個像素分別存在多少個像素)。所以位圖對象保存了它所有的像素。通過縮小尺寸,可以減少像素數量並降低分辨率。這很簡單。我曾經使用過圖像,沒有辦法處理沒有內存使用的大型圖像(認爲像photoshop這樣的軟件,處理器和RAM內存昂貴,想象將這種東西裝入16兆內存中,這是不可能的。抱歉) – DArkO 2011-06-16 18:32:54

+0

謝謝你的煽動。 必須找到一些可以訪問sdcard上的位圖和購買某種分辨率的android庫api。這應該不難,我猜 – Erik 2011-06-16 18:38:15

1

Android中的進程大小有一個嚴格的限制,一個像素四個字節的4百萬像素圖像將自己(在許多設備上)全部打開,沒有任何空間用於您的程序。

我認爲你將需要做以下兩件事之一:創建一個Web服務來在服務器上/在雲中執行圖像處理;或通過直接操作數據而不是使用位圖來學習「即時」處理圖像處理。

+0

感謝@antlersoft,「即時」操作可能是我的解決方案。也許我可以在SD卡上操作位圖,使其更小但保持大小。你怎麼看? – Erik 2011-06-16 18:33:24

相關問題