web-dev-qa-db-ja.com

可変ビットマップへのリソースの読み込み

私はそのようなリソースからビットマップをロードしています:

 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が発生しますが、私が望むものを達成するためのより良い方法を知っていますか?

25
stealthcopter

コピーを作成するにはいくつかの方法があります。このスレッドはあなたを助けるかもしれません: http://www.anddev.org/how_to_modify_the_image_file-t513.html

11
Moss

decodeResource(Resources res, int id, BitmapFactory.Options opts)を使用して、オプションでinMutableを指定します。

http://developer.Android.com/reference/Android/graphics/BitmapFactory.html

24
KNfLrPn

RapidDecoder を使用することをお勧めします。

import rapid.decoder.BitmapDecoder;

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

APIレベル8で機能します。

1
suckgamony

すべてのAPIレベルを処理する必要がある場合は、この投稿を確認してください。

https://stackoverflow.com/a/16314940/878126

0

あなたの代わりに:

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);
0
pedjolino