2013-03-10 4 views
7

मैं एक एंड्रॉइड ऐप बना रहा हूं और मुझे एक कैव में एक छवि (बिटमैप) लोड करने और "चुटकी ज़ूम" इशारा करते हुए इसका आकार बदलना होगा। जब छवि एक निश्चित आकार से अधिक हो, हालांकि, एप्लिकेशन क्रैश हो जाता है (OutOfMemory अपवाद)। मैं छवि के लोडिंग और हेरफेर को कैसे अनुकूलित करूं?बड़े बिटमैप्स की एंड्रॉइड लोडिंग

छवि का उपयोग मैं लोड करने के लिए:

BitmapFactory.decodeResource (ctx.getResources(), R.drawable.image) 

आकर्षित करने के लिए:

imgCanvas.drawBitmap (image, posX, posY, null), 

इसके आकार बदलने के लिए:

Bitmap.createScaledBitmap (originalBitmap, neww, NEWH, true); 

उत्तर

3

यह तुच्छ नहीं है।

छवि की वर्तमान पैमाने और छवि के वर्तमान दृश्य भाग के आधार पर, केवल उपयुक्त संकल्प पर उस छवि का एक हिस्सा लोड:
https://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html

जब ज़ूम आउट किया और आप दिखाना चाहते हैं पूरी छवि को छोटा किया से बड़ा 1 (अधिमानतः एक 2 की एक शक्ति है कि मूल्य) एक मूल्य को यह BitmapRegionDecoder वर्ग से तरीकों कि एक BitmapFactory.Options पैरामीटर का उपयोग करें और inSampleSize यह निर्धारित करते हैं,:,
https://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

ज़ूम इन करते समय पहले ज़ूम इन करें निचला संकल्प जो पहले से दिखाया गया है (जहां आपने SampleSize> 1 का मान उपयोग किया था) और BitmapRegionDecoder का उपयोग करके एक उच्च रिज़ॉल्यूशन संस्करण (जहां inSampleSize आपके द्वारा उपयोग किए गए पिछले मान से छोटा है) लोड करें और धीरे-धीरे उच्च रिज़ॉल्यूशन संस्करण में फीका।

जब उपयोगकर्ता ज़ूम, अपने inSampleSize जब तक ऐसा करना जारी रखें 1.

+0

मैं शुरू में छवि अपने मूल आकार में (inSampleSize = 1) के साथ लोड है। जब मैं "ज़ूम इन" करता हूं तो मुझे एक मान> 1 के साथ नमूना आकार में बदलना होगा और फिर छवि को क्रॉप करें? – Giammy

+0

उपयोगकर्ता ज़ूम इन करने से पहले, आप अपनी संपूर्ण छवि को inSampleSize> 1. के साथ लोड करते हैं। फिर जब उपयोगकर्ता कुछ बिंदुओं पर ज़ूम करता है, तो आप छवि को फिर से लोड करेंगे, लेकिन इसका केवल एक हिस्सा और एक नमूना आकार के साथ जिसमें कम मान है (लेकिन अभी भी 1 से अधिक)। जब उपयोगकर्ता बार-बार ज़ूम करता है, तो किसी बिंदु पर, आपके inSampleSize = 1 (और आप केवल वह भाग लोड करेंगे जो दृश्यमान है)। –

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