2010-09-11 12 views
25

मैं बहुत की तरह एक संसाधन से एक बिटमैप लोड हो रहा हूँ करने के लिए एक संसाधन लोड हो रहा है:एक परिवर्तनशील बिटमैप

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image); 

क्या मैंने पहले यह में मुख्य कैनवास के लिए तैयार हो जाता है बिटमैप में कुछ परिवर्तन करने है क्या करना चाहते हैं मेरे ड्रा विधि (जैसा कि यह बदलने के लिए नहीं जा रहा है, मेरे मुख्य पाश में बहुत सारे ड्राइंग को दोहराना प्रतीत होता है)। मैं निम्नलिखित के साथ बिटमैप में परिवर्तन करने हूँ:

Canvas c = new Canvas(mBackground); 
c.drawARGB(...); // etc 

इसलिए स्वाभाविक रूप से मैं

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor 

तो बचने के लिए है कि मैं बिटमैप की एक प्रतिलिपि बना इतना है कि यह अस्थायी है एक अपवाद मिल

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image).copy(Bitmap.Config.ARGB_8888, true); 

जो समस्या से बचता है हालांकि यह कभी-कभी आउटऑफमेमरी अपवादों का कारण बनता है, मुझे जो चाहिए वह प्राप्त करने के किसी भी बेहतर तरीके से पता है?

उत्तर

11

इसकी एक प्रति बनाने के कई तरीके हैं। यह धागा आपकी मदद कर सकता है: http://www.anddev.org/how_to_modify_the_image_file-t513.html

+4

प्रतिलिपि बनाई जा रही स्मृति मेरे लिए काम नहीं करता है अगर यह मूल छवि है अंदर, मैं एक तरह से MappedByteBuffer का उपयोग कर पाया, मैं इसे यहाँ ब्लॉग किया है: http: // sudarnimalan। blogspot.com/2011/09/android-convert-immutable-bitmap-into.html –

23

decodeResource(Resources res, int id, BitmapFactory.Options opts) का उपयोग करें और विकल्पों में inMutable निर्दिष्ट करें।

http://developer.android.com/reference/android/graphics/BitmapFactory.html

+11

काम करता है, लेकिन कम से कम एपीआई स्तर 11 की आवश्यकता है। – Harri

+0

मैं पुष्टि कर सकता हूं कि एपीआई स्तर एक समस्या है :( – STeN

1

बेहतर होगा कि तुम RapidDecoder का उपयोग करेंगे। एपीआई स्तर के लिए

import rapid.decoder.BitmapDecoder; 

Bitmap mBackground = BitmapDecoder.from(res, R.drawable.image) 
     .mutable().decode(); 

वर्क्स 8.

संबंधित मुद्दे