Ответ 1
Существует несколько способов создания копии. Этот поток может помочь вам: http://www.anddev.org/how_to_modify_the_image_file-t513.html
Я загружаю растровое изображение из такого ресурса:
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);
Что бы избежать проблемы, но иногда вызывает 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, проверьте это сообщение: