web-dev-qa-db-fra.com

Erreur de plantage 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 plantage de 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é à ça?

65
Yerry Huntry

Vous devez convertir votre workingBitmap en Mutable Bitmap pour dessiner sur Canvas. (Remarque: cette méthode n'aide pas à économiser de la mémoire, elle utilisera 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

194
dimetil

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

opt.inMutable = true;

Ajoutez cette ligne à votre code et cela devrait résoudre le plantage.

35
codeFood

À moins que vous ne vouliez pas transformer votre bitmap IMMUTABLE en bitmap MUTABLE, vous pouvez économiser de la mémoire en TOUJOURS RÉUTILISER LE BITMAP

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

Cependant, je pense que cela peut être identique à rendre la bitmap mutable en appelant

workingBitmap.isMutable = true
1
Ujju

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

1
android developer