Загрузка ресурса в изменяемое растровое изображение - PullRequest
25 голосов
/ 12 сентября 2010

Я загружаю растровое изображение из ресурса примерно так:

 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 ]

24 голосов
/ 19 октября 2011

Используйте decodeResource(Resources res, int id, BitmapFactory.Options opts) и укажите inMutable в опциях.

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

11 голосов
/ 22 ноября 2010

Есть несколько способов создать его копию. Эта тема может помочь вам: http://www.anddev.org/how_to_modify_the_image_file-t513.html

1 голос
/ 05 января 2014

Вам лучше использовать RapidDecoder .

import rapid.decoder.BitmapDecoder;

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

Работает для API уровня 8.

0 голосов
/ 24 августа 2013

Если вам нужно обработать все уровни API, прочитайте этот пост:

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

...