2010-07-21 13 views
5

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

Uri data = getIntent().getData(); 
InputStream is = getContentResolver().openInputStream(data); 
Bitmap bitmap = BitmapFactory.decodeStream(is, null, null); 

कोई मदद महान होगी?

+0

आपकी छवि किस प्रारूप में है? – finnw

+2

जेपीईजी। Grr - टिप्पणी लंबी होनी चाहिए ... – timothyjc

उत्तर

1

मैं मानता हूं कि छवि को कई छोटी टाइल वाली छवियों में तोड़ने का सबसे आसान तरीका है और आप जिस छवि को बाद में बनाते हैं उसे उचित लोड करने के लिए।

हालांकि, अगर आप ऐसा नहीं करना चाहते हैं, तो आपको जेपीईजी के एन्कोडिंग को देखने के लिए मजबूर होना पड़ सकता है।

आप क्या कर सकते हैं फ़ाइल से हेडर को एक नई फ़ाइल में कॉपी करने के साथ-साथ एक नई फ़ाइल बनाने के लिए इच्छित पिक्सेल निकालने के साथ कुछ भी कर सकते हैं। फिर नई फ़ाइल को पुनः लोड करने से आप उस छवि का केवल सबसेट प्राप्त कर सकते हैं, जिसके साथ आप काम करना चाहते हैं, और सभी नियमित जावा कार्यक्षमता और कक्षाएं आपके उपयोग के लिए समान रूप से उपलब्ध होंगी।

मुझे पता है कि यह एक सुरुचिपूर्ण या सरल समाधान नहीं है, हालांकि यह गारंटी देता है कि आप मूल जावा कार्यक्षमता का उपयोग करने में सक्षम होंगे, जिसे आप उपयोग करने में सक्षम होने की उम्मीद करते हैं।

+0

मेरे हैकिंग कौशल के लिए बहुत कठिन लगता है। मुझे किसी अन्य तकनीकी सीमाओं के लिए उस परियोजना को छोड़ना पड़ा :( – timothyjc

0

मुझे लगता है कि आप गलत दिशा से समस्या का सामना कर रहे हैं।

यदि बिटमैप पहले से इतना बड़ा है तो इसे एक निरंतर छवि के रूप में लोड नहीं किया जा सकता है, इसे एक छवि के रूप में क्यों स्टोर करें? इसे टाइल्स में स्लाइस करें, फिर केंद्र टाइल/टाइल्स लोड करें और उन पर कार्य करें।

+0

हाँ। मैं पूरी छवि को स्मृति में पढ़ना नहीं चाहता, बस केंद्र टाइल जैसा आपने इसे रखा है। क्या आपके पास इसके लिए कुछ कोड है? – timothyjc

+0

@timothyjc: स्लाइस में इसे काटने के लिए? आप अपने ऐप के बाहर ऐसा करने के लिए Imagemagick जैसे कुछ का उपयोग कर सकते हैं। http://superuser.com/questions/35832/split-a-image-into-tiles –

1

आप 2 चरणों में यह कर सकते हैं:

  1. , बिटमैप के आकार पाने inJustDecodeBounds = सच का उपयोग करके।

  2. बिटमैपरेगियन डिकोडर का उपयोग केवल उस हिस्से को डीकोड करने के लिए करें जिसे आप चाहते हैं।

नकारात्मक? यह केवल एपीआई 10 से काम करता है (लेकिन यह पहले से ही बहुमत है ...)।

+0

यह अच्छा विचार है लेकिन समस्या यह है कि शायद फसल की छवि बहुत बड़ी होगी और ओओएम –

+1

हो सकता है यदि बिटमैप ढेर के अंदर सहेजा नहीं जा सकता है, तो इसका कारण होगा ओओएम। आप यह जांच सकते हैं कि यह कितना होगा और ओओएम से बचें, अगर आप चाहें तो भी। अगर आपके पास एक बड़ा बिटमैप है और इसे फसल करने और ओओएम से बचने की जरूरत है, तो आप जेएनआई का उपयोग कर सकते हैं जैसा कि मैंने यहां किया है: https: // github.com/AndroidDeveloperLB/AndroidJniBitmapOperations –

+0

मैं पूरी तरह से आपकी लाइब्रेरी का प्रयास करूंगा। thanls –

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