web-dev-qa-db-fra.com

Chargement d'une ressource sur un bitmap mutable

Je charge un bitmap à partir d'une ressource telle que:

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

Ce que je veux faire, c’est d’apporter quelques modifications au bitmap avant qu’il ne soit dessiné dans le canevas principal de ma méthode draw ( va changer). J'apporte les modifications au bitmap avec les éléments suivants:

Canvas c = new Canvas(mBackground);
c.drawARGB(...); // etc

Alors naturellement, je reçois une exception

Java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor

Donc, pour éviter que je fasse une copie du bitmap afin qu'il soit mutable

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);

Qui évite le problème, mais cela cause parfois des exceptions OutOfMemoryExceptions, connaissez-vous de meilleurs moyens d’atteindre ce que je veux?

25
stealthcopter

Il existe plusieurs façons de créer une copie de celui-ci. Ce fil pourrait vous aider: http://www.anddev.org/how_to_modify_the_image_file-t513.html

11
Moss

Utilisez decodeResource(Resources res, int id, BitmapFactory.Options opts) et spécifiez inMutable dans les options.

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

23
KNfLrPn

Vous feriez mieux d'utiliser RapidDecoder .

import rapid.decoder.BitmapDecoder;

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

Fonctionne pour API niveau 8.

1
suckgamony

si vous avez besoin de gérer tous les niveaux de l'API, consultez ce post:

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

0
android developer