wake-up-neo.com

Laden einer Ressource in eine veränderbare Bitmap

Ich lade eine Bitmap von einer Ressource wie folgt:

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

Was ich tun möchte, ist, einige Änderungen an der Bitmap vorzunehmen, bevor sie in meiner draw -Methode auf die Hauptleinwand gezeichnet wird (Da es sehr verschwenderisch erscheint, viele Zeichnungen in meiner Hauptschleife zu wiederholen, wenn dies nicht der Fall ist Veränderung). Ich mache die Änderungen an der Bitmap mit folgendem:

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

Ich bekomme natürlich eine Ausnahme

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

Um zu vermeiden, dass ich eine Kopie der Bitmap erstellt habe, ist sie veränderbar

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

Welche vermeiden das Problem, obwohl es manchmal OutOfMemoryExceptions verursacht, wissen Sie bessere Wege, um zu erreichen, was ich will?

25
stealthcopter

Es gibt mehrere Möglichkeiten, eine Kopie davon zu erstellen. Dieser Thread könnte Ihnen helfen: http://www.anddev.org/how_to_modify_the_image_file-t513.html

11
Moss

Verwenden Sie decodeResource(Resources res, int id, BitmapFactory.Options opts) und geben Sie in den Optionen inMutable an.

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

23
KNfLrPn

Sie sollten besser RapidDecoder verwenden.

import rapid.decoder.BitmapDecoder;

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

Funktioniert für API Level 8.

1
suckgamony

falls Sie mit allen API-Levels arbeiten müssen, lesen Sie diesen Beitrag:

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

0

Anstelle deiner:

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

Verwenden:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;

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