webentwicklung-frage-antwort-db.com.de

Unveränderlicher Bitmap-Absturzfehler

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)

Ich bekomme diesen Absturzfehler von der Entwicklerkonsole. Ich verstehe nicht, was das Problem ist.

    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);

Ich denke, es hängt damit zusammen?

65
Yerry Huntry

Sie müssen Ihr workingBitmap in Mutable Bitmap Konvertieren, um auf Canvas zu zeichnen. (Hinweis: Diese Methode hilft nicht, Speicher zu sparen, sondern benötigt zusätzlichen Speicher.)

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

Diese Antwort hilft, keinen Speicher zu verschwenden Konvertieren Sie unveränderliche Bitmaps in veränderbare Bitmaps

194
dimetil

BitmapFactory.decodeResource() gibt eine unveränderliche Kopie der Bitmap zurück und Sie können nicht auf die Zeichenfläche zeichnen. Um die Zeichenfläche zu erhalten, müssen Sie eine veränderbare Kopie der Bitmap der Bilder erhalten. Dies kann durch Hinzufügen eines einzelnen Zeilencodes erfolgen.

opt.inMutable = true;

Fügen Sie diese Zeile Ihrem Code hinzu und es sollte den Absturz beheben.

35
codeFood

Sofern Sie Ihre IMMUTABLE-Bitmap nicht zu MUTABLE-Bitmap machen möchten, können Sie mit IMMER WIEDERVERWENDEN DER BITMAP Speicher sparen

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

Ich denke jedoch, dass dies dasselbe sein kann, wie das Bitmap durch Aufrufen veränderbar zu machen

workingBitmap.isMutable = true
1
Ujju

um die Speichernutzung zu minimieren, lesen Sie diesen Beitrag zum Konvertieren/Dekodieren einer veränderlichen Bitmap direkt aus den Ressourcen:

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

1