2011-11-20 37 views
2

我正在操縱相對較大的圖像,大約5MP,有時甚至更多。我需要在內存中的兩個副本進行操作。 現在,加載的圖像佔用了大量的內存,比更多的可用由默認的Android堆是16MB分別爲24MB導致以下錯誤:適用於大圖像的Android VM堆策略

11-20 18:02:28.984: E/AndroidRuntime(7334): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我需要全分辨率,從而在加載圖像縮減沒有幫助。 解決此問題的最佳解決方案是什麼?有沒有內置的方法來動態加載存儲位圖塊?有人可以給我一些提示,我如何克服記憶問題,例如通過使用特定的緩存策略?

問候,

回答

1

您可以在NDK分配更多的內存。您必須編寫本機代碼來操作圖像,否則您必須找出一種方法來分配本地圖像內存,然後將其傳回給Java。

Bitmap/Canvas use and the NDK

另一種選擇可能是一個單一的圖像加載到存儲器,並把它分解成塊進行處理。將這些塊保存到文件系統中。所以,說你2張大圖。你加載第一張圖片,將它分成4部分,保存它們,加載第二張圖片,將它分成4部分,保存它們,然後爲每張圖片加載第一部分,然後完成你的工作。這意味着您知道單個圖像都不會超過堆的最大值,並且您需要做的是(基本上)像素級別,並且不需要訪問周圍的像素數據(如果您在邊緣會遇到麻煩)需要相鄰像素信息)。

沒有降採樣,分裂或ndk,我不知道如何將更多的圖像數據存入內存。也許降低顏色信息。我們在一個產品中做到這一點。將每個像素表示爲16位而不是24或32位。我們的產品功能性強於「漂亮」,因此顏色信息丟失並不是什麼大問題。

+0

謝謝!我不知道NDK沒有內存限制。 – Hyndrix

1

你應該看對內存管理的視頻:http://www.youtube.com/watch?v=_CruQY55HOk 在大約6分鐘進去,他涵蓋了LargeHeap清單選項添加到蜂窩。

+0

感謝您的視頻鏈接。帕特里克的演講內容非常豐富,特別是Eclipse MAT的使用。 – Hyndrix