Carga de un recurso para un mapa de bits mutable
-
02-10-2019 - |
Pregunta
Estoy cargando un mapa de bits de un recurso de este modo:
Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);
Lo que quiero hacer es hacer algunos cambios en el mapa de bits antes de que se ve arrastrado a la lona principal en mi dibujar método (como parece un desperdicio de repetir un montón de dibujo en mi bucle principal cuando no va a cambiar). Estoy haciendo los cambios en el mapa de bits con la siguiente:
Canvas c = new Canvas(mBackground);
c.drawARGB(...); // etc
Así que, naturalmente consigo una excepción
java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
Así que para evitar que hice una copia del mapa de bits de modo que es mutable
Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);
Qué evitar el problema sin embargo, a veces causa OutOfMemoryExceptions, no conoce nada mejor manera de lograr lo que quiero?
Solución
Hay varias formas de crear una copia de la misma. Este hilo te pueden ayudar: http://www.anddev.org/how_to_modify_the_image_file-t513.html
Otros consejos
Uso decodeResource(Resources res, int id, BitmapFactory.Options opts)
y especificar inMutable
en las opciones.
http://developer.android.com/reference/android/graphics/BitmapFactory.html
import rapid.decoder.BitmapDecoder;
Bitmap mBackground = BitmapDecoder.from(res, R.drawable.image)
.mutable().decode();
Obras para el nivel de API 8.
en caso de tener que manejar todos los niveles de la API, echa un vistazo a este post:
En lugar de los suyos:
Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);
Uso:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image, options);