私はそのようなリソースからビットマップをロードしています:
Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);
私がやりたいのは、ビットマップがメインキャンバスに描画される前に、ビットマップにいくつかの変更を加えることですdrawメソッドt変更する予定です)。次のようにビットマップに変更を加えています。
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);
問題を回避しますが、時々OutOfMemoryExceptionsが発生しますが、私が望むものを達成するためのより良い方法を知っていますか?
コピーを作成するにはいくつかの方法があります。このスレッドはあなたを助けるかもしれません: http://www.anddev.org/how_to_modify_the_image_file-t513.html
decodeResource(Resources res, int id, BitmapFactory.Options opts)
を使用して、オプションでinMutable
を指定します。
http://developer.Android.com/reference/Android/graphics/BitmapFactory.html
RapidDecoder を使用することをお勧めします。
import rapid.decoder.BitmapDecoder;
Bitmap mBackground = BitmapDecoder.from(res, R.drawable.image)
.mutable().decode();
APIレベル8で機能します。
すべてのAPIレベルを処理する必要がある場合は、この投稿を確認してください。
あなたの代わりに:
Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);
ユーザー:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image, options);