83 votes

Erreur de crash du bitmap immuable

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
at android.graphics.Canvas.<init>(Canvas.java:127)
at app.test.canvas.StartActivity.applyFrame(StartActivity.java:214)
at app.test.canvas.StartActivity$1.onClick(StartActivity.java:163)
at android.view.View.performClick(View.java:4223)
at android.view.View$PerformClick.run(View.java:17275)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4898)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
at dalvik.system.NativeStart.main(Native Method)

Je reçois cette erreur de crash dans la console du développeur Je ne comprends pas quel est le problème

    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inScaled = true;
    opt.inPurgeable = true;
    opt.inInputShareable = true;
    Bitmap brightBitmap = BitmapFactory.decodeResource(getResources(), position, opt); 
    brightBitmap = Bitmap.createScaledBitmap(brightBitmap, 550, 550, false);
    chosenFrame = brightBitmap;
    Bitmap workingBitmap = Bitmap.createBitmap(chosenFrame);
    workingBitmap = Bitmap.createBitmap(workingBitmap); 
    Canvas c = new Canvas(workingBitmap);

Je pense que c'est lié à cela ?

228voto

dimetil Points 1327

Vous devez convertir votre workingBitmap a Mutable Bitmap pour s'appuyer sur Canvas . (Note : cette méthode ne permet pas d'économiser de la mémoire, elle utilise de la mémoire supplémentaire)

Bitmap workingBitmap = Bitmap.createBitmap(chosenFrame);
Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);

Cette réponse permet de ne pas gaspiller de mémoire Convertir un bitmap immuable en un bitmap mutable

43voto

codeFood Points 251

BitmapFactory.decodeResource() renvoie une copie immuable de l'image bitmap et vous ne pouvez pas dessiner sur son canevas. Pour obtenir son canevas, vous devez obtenir une copie mutable du bitmap de l'image, ce qui peut être fait par l'ajout d'une seule ligne de code.

opt.inMutable = true;

Ajoutez cette ligne à votre code et le problème devrait être résolu.

4voto

Ujju Points 1340

À moins que vous ne souhaitiez transformer votre bitmap IMMUTABLE en bitmap MUTABLE, vous pouvez économiser de la mémoire en utilisant la méthode suivante TOUJOURS RÉUTILISER L'IMAGE BITMAP

workingBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(workingBitmap);

Cependant, je pense que cela revient à rendre le bitmap mutable en appelant

workingBitmap.isMutable = true

4voto

Joe Points 621

Cela fonctionne également, je viens de le tester.

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
return BitmapFactory.decodeByteArray(resultDecoded, 0, resultDecoded.length,options);

1voto

android developer Points 20939

Afin de minimiser l'utilisation de la mémoire, vous pouvez consulter cet article sur la conversion/décodage d'un bitmap mutable directement à partir des ressources :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X