2010-09-13 12 views
8

कहें कि मेरे पास डिस्क पर बिटमैप कुछ हद तक बड़ा है (यानी अधिकांश फोन की मेमोरी में फिट नहीं है)। मैं स्क्रीन पर केवल इसके कुछ हिस्सों को इस तरह से खींचना चाहता हूं कि स्केल नहीं किया गया है (यानी inSampleSize == 1)क्या एंड्रॉइड में फ़ाइल से आंशिक रूप से बिटमैप लोड करने और आकर्षित करने का कोई तरीका है?

क्या केवल उस हिस्से को लोड/ड्रॉ करने का कोई तरीका है जिसे मैं Rect को पूरे लोड किए बिना क्षेत्र निर्दिष्ट करना चाहता हूं बिटमैप सामग्री?

उत्तर

9

मुझे पूरा भरोसा है कि यह संभव है क्योंकि आप बिना किसी समस्या के ImageView में वास्तव में बड़ी बिटमैप फ़ाइल लोड कर सकते हैं, इसलिए बड़े बिटमैप्स को संभालने के लिए एक तरह का अंतर्निहित तरीका होना चाहिए ... और कुछ प्रयासों के बाद पूरे बिटमैप लोड करने के बजाय

और मैन्युअल रूप से यह अपने आप को आकर्षित, एक Drawable बजाय के रूप में यह लोड:, मैं एक समाधान मिल गया है

InputStream mapInput = getResources().openRawResource(
     R.drawable.transit_map); 
_map = Drawable.createFromStream(mapInput, "transit_map"); 

_map.setBounds(0, 0, _mapDimension.width(), _mapDimension.height()); 

मैं संसाधन फ़ाइल उपयोग कर रहा हूँ, लेकिन आप के बाद से से छवि लोड करने के लिए Drawable.createFromStream का उपयोग कर सकते हैं कोई InputStream, यह मनमाने ढंग से बिटमैप के साथ काम करना चाहिए।

फिर, इसलिए जैसे वांछित कैनवास पर यह आकर्षित करने के लिए Drawable.draw विधि का उपयोग करें:

int left = -(int) contentOffset.x; 
int top = -(int) contentOffset.y; 
int right = (int) (zoom * _mapDimension.width() - contentOffset.x); 
int bottom = (int) (zoom * _mapDimension.height() - contentOffset.y); 

_map.setBounds(left, top, right, bottom); 
_map.draw(canvas); 

उपरोक्त मामले में के रूप में, तुम भी माप सकते हैं और drawable की सीमा में चालाकी करके रूप में अच्छी तरह बिटमैप अनुवाद और बिटमैप के केवल प्रासंगिक भाग लोड किए जाएंगे और Canvas पर खींचे जाएंगे।

परिणाम केवल एक एकल 200 केबी बिटमैप फ़ाइल से एक चुटकी-ज़ूम करने योग्य दृश्य है। मैंने 22 एमबी पीएनजी फ़ाइल के साथ इसका परीक्षण भी किया है और यह स्क्रीन अभिविन्यास में परिवर्तन करते समय भी OutOfMemoryError के बिना काम करता है।

+0

आपके प्रश्न में, आपने कहा है कि छवि स्मृति में फिट नहीं है। क्या यह बदल गया है? –

+0

नहीं, यह नहीं है। यह एक ही पीएनजी फ़ाइल है, पूरी बात है। – chakrit

1

आम तौर पर यह संभव नहीं है, खासकर जब से अधिकांश छवि प्रारूप संकुचित होते हैं, इसलिए आप यह भी नहीं जानते कि बाइट्स को तब तक पढ़ना नहीं है जब तक आप असम्पीडित रूप निकाले नहीं जाते।

अपनी छवि को छोटे टाइल्स में विभाजित करें और केवल उस टाइल को लोड करें जिसे आप रनटाइम पर प्रदर्शित करना चाहते हैं। झटकेदार स्क्रॉलिंग से बचने के लिए, आप पृष्ठभूमि थ्रेड पर केवल दृष्टि से बाहर होने वाले टाइल्स को प्रीलोड कर सकते हैं (वे दृश्यमान टाइल्स को सीमाबद्ध करते हैं)।

4

अब यह बहुत प्रासंगिक है: BitmapRegionDecoder

नोट: के बाद से एंड्रॉयड एसडीके 10

3

यह आसानी से RapidDecoder का उपयोग करके किया जा सकता है उपलब्ध।

import rapid.decoder.BitmapDecoder; 

Rect bounds = new Rect(10, 20, 30, 40); 
Bitmap bitmap = BitmapDecoder.from("your-file.png") 
          .region(bounds) 
          .decode(); 
imageView.setImageBitmap(bitmap); 

यह एंड्रॉइड 2.2 (एपीआई लेवल 8) के लिए समर्थन करता है।

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

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