2012-10-29 13 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) 

मैं डेवलपर कंसोल से इस क्रैश त्रुटि .. मुझे समझ नहीं आता समस्या है क्या ..अपरिवर्तनीय बिटमैप दुर्घटना त्रुटि

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

मुझे लगता है कि इस से संबंधित है मिलता है?

उत्तर

163

Canvas पर ड्राइंग के लिए आपको अपने workingBitmap से Mutable Bitmap को परिवर्तित करना होगा। (नोट: इस विधि स्मृति को बचाने में मदद नहीं करता है, यह अतिरिक्त स्मृति का उपयोग करेगा)

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

इस उत्तर में मदद करता है स्मृति बर्बाद मत करो Convert immutable bitmap to a mutable bitmap

+0

यह विधि स्मृति को बचाने में मदद करती है। जब मैं विधि का उपयोग करता हूं तो मैंने म्यूटेबल बिटमैप – dimetil

+0

करने के लिए सबसे आसान तरीका के साथ उत्तर संपादित किया, फिर ऐप क्रैश हो जाता है और लॉगकैट में यह कहता है कि कैनवास रीसाइक्लिंग बिटमैप का उपयोग नहीं कर सकता है –

+0

एनवीएम मेरी टिप्पणी एटीएम, बीमार अपनी विधि का प्रयास करें फिर बीमार पुनः- पद। धन्यवाद –

0

क्रम में स्मृति के उपयोग को कम करने के, तो आप इस बाहर की जाँच कर सकते हैं संसाधनों से परिवर्तित/एक परिवर्तनशील बिटमैप डिकोडिंग सीधे के बारे में पोस्ट:

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

30

BitmapFactory.decodeResource() बिटमैप का एक अपरिवर्तनीय प्रतिलिपि वापस आती है और आप के लिए आकर्षित नहीं कर सकता इसके कैनवास अपने कैनवास प्राप्त करने के लिए, आपको छवियों के बिटमैप की एक परिवर्तनीय प्रति प्राप्त करने की आवश्यकता है और इसे सिंगल लाइन कोड जोड़ के साथ किया जा सकता है।

opt.inMutable = true; 

उस कोड को अपने कोड में जोड़ें और इसे क्रैश को संबोधित करना चाहिए।

+2

यह जवाब होना चाहिए क्योंकि यह स्मृति का उपभोग नहीं करता है जो बिटमैप.copy (...) – java

+0

का उपयोग करते समय मामला है बिटमैप गुणों की जांच करना और बिटमैप को स्मृति में लोड करने से पहले सेट करना आवश्यक है। अगर स्मृति एक मुद्दा है, तो इस उत्तर का प्रयोग करें, संक्षेप में यह है कि यदि आप बड़े आयामों के साथ बिटमैप का उपयोग कर रहे हैं। – Thracian

0

जब तक आप परिवर्तनशील बिटमैप करने के लिए अपने IMMUTABLE बिटमैप बनाने के लिए नहीं करना चाहते हैं, तो आप स्मृति द्वारा हमेशा बिटमैप

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

पुन: उपयोग को बचा सकता है लेकिन मुझे लगता है कि इस बिटमैप से परिवर्तनशील बनाने के रूप में ही हो सकते हैं कॉलिंग

workingBitmap.isMutable = true 
संबंधित मुद्दे