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?

¿Fue útil?

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

RapidDecoder .

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:

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

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top