2012-10-29 15 views
55
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) 

otrzymuję ten błąd zderzenia z konsoli programisty .. ja nie rozumiem, co jest problem ..Niezmienne błąd katastrofy bitmapy

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

myślę, że to jest związane z tym?

Odpowiedz

163

Musisz przekonwertować swój workingBitmap na Mutable Bitmap, aby pobrać Canvas. (Uwaga: ta metoda nie pomoże zaoszczędzić pamięć, używa dodatkowej pamięci)

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

Odpowiedź ta pozwala nie tracić pamięć Convert immutable bitmap to a mutable bitmap

+0

ta metoda pomaga zaoszczędzić pamięć. Edytowałem odpowiedź w najprostszy sposób, aby wykonać mutabilną bitmapę – dimetil

+0

, gdy używam tej metody, a następnie aplikacja się zawiesza, aw logcat mówi, że płótno nie może użyć zregenerowanej mapy bitowej –

+0

Nvm mój komentarz atm, źle spróbuj swojej metody, a następnie źle stanowisko. dzięki –

30

BitmapFactory.decodeResource() zwraca niezmienna kopię bitmapy i nie można zwrócić jego płótno. Aby uzyskać jego płótno, musisz uzyskać możliwą do zmultiplikowania kopię bitmapy obrazów, którą można wykonać za pomocą dodania pojedynczego kodu.

opt.inMutable = true; 

Dodaj tę linię do kodu i powinna rozwiązać problem.

+2

to powinna być odpowiedź, ponieważ nie zajmuje ona pamięci, która jest w przypadku korzystania z bitmap.copy (...) – java

+0

"Ważne jest, aby sprawdzić właściwości Bitmap i ustawić je przed załadowaniem Bitmapy do pamięci. Użyj tej odpowiedzi, jeśli pamięcią jest problem, aczkolwiek jest to konieczne, jeśli używasz bitmapy z dużymi wymiarami. – Thracian

0

Chyba nie chcesz, aby Twoje niezmienne bitmapę zmienny bitmapę, można zapisać pamięć ZAWSZE Ponowne użycie bitmapy

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

Jednak myślę, że to może być taka sama jak czyniąc bitmapy zmienny przez dzwonienie pod numer