2010-09-11 25 views
25

Je suis le chargement d'un bitmap d'une ressource comme ceci:Le chargement d'une ressource à un bitmap mutable

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

Ce que je veux faire est de faire quelques modifications à la bitmap avant qu'il ne soit tiré sur la toile principale dans mon draw méthode (Comme il semblerait inutile de répéter beaucoup de dessin dans ma boucle principale quand il ne va pas changer). Je fais les changements 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 fait 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 il provoque parfois OutOfMemoryExceptions, connaissez-vous de meilleurs moyens d'atteindre ce que je veux?

Répondre

11

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

+4

copie à l'intérieur de la mémoire ne fonctionne pas pour moi si elle est l'image originale, je l'ai trouvé un moyen en utilisant MappedByteBuffer, je l'ai blogué ici: http: // sudarnimalan. blogspot.com/2011/09/android-convert-immutable-bitmap-into.html –

1

Vous feriez mieux d'utiliser RapidDecoder.

import rapid.decoder.BitmapDecoder; 

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

Works pour le niveau de l'API 8.