2010-09-11 42 views
25

我加載一個位圖從資源,像這樣:加載資源的可變位

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image); 

我想要做的就是進行一些更改位圖前,它被吸引到主畫布在我繪製方法(因爲當它不會改變時,在我的主循環中重複大量繪圖似乎很浪費)。我有以下進行更改位圖:

Canvas c = new Canvas(mBackground); 
c.drawARGB(...); // etc 

所以很自然我得到一個異常

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor 

因此,爲了避免重蹈我的位圖的副本,以便它是可變的

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image).copy(Bitmap.Config.ARGB_8888, true); 

它避免了這個問題,但它有時會導致OutOfMemoryException異常,知道有什麼更好的方法來實現我想要的嗎?

回答

11

有幾種方法來創建它的副本。此主題可能對您有所幫助:http://www.anddev.org/how_to_modify_the_image_file-t513.html

+4

複製內存裏,我不工作,如果它是原始圖像,我發現使用MappedByteBuffer的方式,我在這裏的博客上它:HTTP:// sudarnimalan。 blogspot.com/2011/09/android-convert-immutable-bitmap-into.html – 2011-09-15 05:06:13

1

你最好使用RapidDecoder

import rapid.decoder.BitmapDecoder; 

Bitmap mBackground = BitmapDecoder.from(res, R.drawable.image) 
     .mutable().decode(); 

Works的API級別8