25

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

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

私がやりたいのは、drawメソッドでメインキャンバスに描画される前にビットマップにいくつかの変更を加えることです(変更されないときにメインループで多くの描画を繰り返すのは無駄に思えるので)。私は次のようにビットマップに変更を加えています:

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

4

5 に答える 5

24

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

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

于 2011-10-19T03:44:33.723 に答える
10

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

于 2010-11-22T11:40:59.867 に答える
1

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

import rapid.decoder.BitmapDecoder;

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

APIレベル8で動作します。

于 2014-01-05T09:01:19.877 に答える
0

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

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

于 2013-08-24T10:04:30.560 に答える
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);
于 2019-09-12T14:04:25.507 に答える