"कैनवास: बहुत बड़े बिटमैप को खींचने की कोशिश कर रहा है" जब एंड्रॉइड एन डिस्प्ले साइज़ छोटे से बड़ा हो गया


83

मेरे पास एक प्रकाशित ऐप है जो एंड्रॉइड एन पर स्टार्टअप पर दुर्घटनाग्रस्त हो रहा है जब नव शुरू की गई Display sizeओएस सेटिंग बहुत बड़े मूल्य पर सेट है।

जब मैं लॉगकट में देखता हूं, तो मुझे निम्न संदेश दिखाई देता है:

java.lang.RuntimeException: Canvas: trying to draw too large(106,975,232 bytes) bitmap.

मैंने अपनी पहली गतिविधि में एक ImageView को समस्या का पता लगाया है जो एक अच्छी बड़ी पृष्ठभूमि छवि दिखाता है। प्रश्न में छवि 2048x1066 है और मेरी जेनेरिक drawablesनिर्देशिका में है, इसलिए कोई भी घनत्व नहीं है, इस छवि का उपयोग किया जाएगा।

Display sizeसेटिंग होने पर सब कुछ ठीक चलता है Small। लेकिन जब मैं ऊपर जाता हूं Default, तो यह काम करना बंद कर देता है। यदि मैं तब छवि को एक छोटे से स्वैप करता हूं, तो यह काम करता है Default, लेकिन अगर मैं ऊपर जाता हूं Large, तो यह फिर से काम करना बंद कर देता है।

मेरा अनुमान है कि समायोजित Display sizeकरने से आपके डिवाइस को उच्च पिक्सेल घनत्व के साथ शारीरिक रूप से छोटे उपकरण की तरह व्यवहार करना पड़ता है। लेकिन मुझे समझ नहीं आ रहा है कि मैं यहाँ क्या करने वाला हूँ। यदि मैं उत्तरोत्तर उच्च संकल्पों के लिए उत्तरोत्तर छोटी छवियों में रखता हूं, तो यह वास्तव में बड़े डिस्प्ले पर अच्छा नहीं लगेगा। या मैं कुछ समझ नहीं रहा हूँ?

किसी भी प्वाइंटर की अत्यधिक सराहना की जाएगी।


25
"प्रश्न में छवि 2048x1066 है और मेरे जेनेरिक ड्रॉअर्स डायरेक्टरी में है, इसलिए घनत्व कोई फर्क नहीं पड़ता, इस छवि का उपयोग किया जाएगा" - के res/drawable/लिए एक पर्याय है res/drawable-mdpi/। यदि आप चाहते हैं कि घनत्व, उपयोग res/drawable-nodpi/या केres/drawable-anydpi/ आधार पर छवि को छोटा न किया जाए ।
कॉमन्सवेयर

3
"क्या आप कह रहे हैं कि 100x100 पिक्सेल की छवि विभिन्न विभिन्न निर्देशिकाओं में रह रही है, जो वास्तव में लेआउट पर जाने से पहले इसका वर्चुअल भिन्न-रिज़ॉल्यूशन संस्करण बनाने के लिए मापी गई है?" - यह निर्भर करता है कि आपके पास क्या घनत्व है और आप किस उपकरण पर चल रहे हैं। अगर एक सटीक मैच होता है, तो कुछ भी नहीं बदला जाता है। यदि कोई सटीक मिलान नहीं है, तो पास के घनत्व की छवि को फिर से खोल दिया जाता है। इसलिए, यदि आपके पास केवल res/drawable/foo.png(उर्फ res/drawable-mdpi/foo.png) है, और आपकी डिवाइस है xhdpi, तो छवि दोनों अक्षों के साथ दोगुनी हो जाएगी, 4x मेमोरी को ऊपर ले जाएगी।
कॉमन्सवेयर

4
आपकी त्रुटि में 106975232 मान छवि के संकल्प के ठीक 49x होता है, जिसमें दोनों कुल्हाड़ियों के साथ 7x पुनरुत्पादन होता है। मैंने जो अपेक्षा की थी, उससे बहुत अधिक है। मुझे एंड्रॉइड 7.0 में प्रदर्शन आकार सेटिंग्स के साथ खेलने का मौका अभी तक नहीं मिला है, इसलिए मैं इसे अपनी बढ़ती-बढ़ती सूची में
जोड़ दूंगा

6
49x पर अच्छा कैच! मुझे लगता है कि मैं समझा सकता हूं कि यह इतना ऊंचा क्यों है। ध्यान रखें कि वह नंबर बाइट्स है। यह चित्र 24-बिट का है, लेकिन यह शायद 32 बिट प्रति पिक्सेल में पढ़ा जाता है। यह स्मृति में 8732672 बाइट्स बनाता है, जो उस आंकड़े में 12.25 बार जाता है, जो प्रत्येक अक्ष के साथ 3.5x स्केलिंग का अर्थ है। यह उपकरण xxhdpi है, इसलिए ऐसा लगता है कि यह सही के बारे में हो सकता है। किसी भी तरह से, मुझे नहीं पता था कि संसाधनों को इस तरह से बदला जाएगा। सहायता के लिए धनयवाद! (वैसे, छवि को ड्रॉबल-नॉडपी में ले जाना वास्तव में इसे ठीक करता है।)
ब्रायन राक

1
आपको वास्तव में जोहान के उत्तर को स्वीकार करना चाहिए
एस जैकब पावेल

जवाबों:


167

मैं अपना मामला, (hi-res) स्पलैश बिटमैप को ड्रॉएबल से ड्रॉएबल-xxhdpi में ले जा रहा था।

मुझे भी यही समस्या थी। मैं अपने स्प्लैश स्क्रीन पर शक नहीं किया समस्या हो, क्योंकि यह है कि ऐप्स शुरू कर दिया है दिखाया गया है, लेकिन यह पता चला स्प्लैश स्क्रीन समस्या है।

मेरे मामले में स्प्लैश स्क्रीन में xxhdpi रिज़ॉल्यूशन है, और इसे गलती से ड्रॉएबल-xxhdpi के बजाय ड्रॉबल फ़ोल्डर में रखा गया था । इससे एंड्रॉइड ने अनुमान लगाया कि स्प्लैश स्क्रीन में mdpi रिज़ॉल्यूशन था और छवि को 3 * 3 गुना करने के लिए इसका आकार आवश्यक है और एक बिटमैप बनाने की कोशिश कर रहा है।


1
मैं अनुमान लगा रहा हूं: तो, एंड्रॉइड ने एक्सएक्सएचडीपीआई से एचडीपीआई तक की छवि को स्केल किया, उदाहरण के लिए लाइटर इमेज? जैसा कि आपने 3 * 3 -> 1/1 से 1/3 उदाहरण के लिए कहा है?
निंजा कोडिंग

कलसरा मैगमाज नोट्स के रूप में, यह अब mipmap-xxhdpi है।
डाना रॉबिन्सन

37

एंड्रॉइड: लाइनों के बीच मैनिफ़ेस्ट फ़ाइल के एप्लिकेशन टैग में नीचे कोड जोड़ने के बाद मैंने समस्या का हल किया ।

android:hardwareAccelerated="false"

3
खैर, कुछ घंटे बिताने के बाद यह समाधान xiaomi और Samsung मोबाइल समस्याओं के लिए काम करता है।
शिहाब उद्दीन

4
इसके परिणामस्वरूप CardView के सभी उन्नयन अक्षम हो जाएंगे। तो उचित समाधान बिटमैप को छोटे आकार में स्केल करना होगा।
सचिन सोमा

1
अनुप्रयोग गतिविधि में हार्डवेयर त्वरण को अक्षम करने के बजाय इसे गतिविधि, विंडो, दृश्य स्तर में नियंत्रित करना अधिक उपयोगी होगा।
मुखमद्शेर

1
लेकिन, करने के बाद कुछ और समस्या खड़ी हो जाती है android:hardwareAccelerated="false" । कुछ डिवाइस में एक अजीब दृश्य दिखा रहा है, जिसका एपीआई स्तर 22 से नीचे है।
राजकुमार ढोलकिया

3
ऐसा मत करो, यह आपके ऐप को धीमा कर देता है।
करियो

11

मुझे नहीं पता कि इससे किसी को मदद मिलेगी, लेकिन मैं इसे यहां छोड़ दूंगा। मेरे मामले में - समस्या केवल एंड्रॉइड 7 के साथ सोमसुंग उपकरणों पर थी, और समस्या छप स्क्रीन अनुपात में थी। 1024 px में ऊंचाई बदलने के बाद - सब कुछ ठीक काम करता है


मेरा मुद्दा बिटमैप (jpg, png) ड्रॉबल (बिना प्रत्यय) फ़ोल्डर में था। यह मेरी मूर्खता है, लेकिन शायद यह किसी को मदद करता है :-)
गोइंग

यह मददगार है! एक ही समस्या केवल सैमसंग ... आपके पास पहले क्या था और आपने इसे कैसे ठीक किया?
M'hamed

क्या आप URL से छवियों को लोड करने की कोशिश कर रहे थे। मैं एंड्रॉइड 7 पर केवल सैमसंग गैलेक्सी एस 6 के साथ एक ही मुद्दे का सामना कर रहा हूं। मैं पुनर्नवीलर व्यू में छवियां लोड कर रहा हूं। मैं अभी भी यह पता नहीं लगा सकता। @ मुहम्मद
रोहित सिंह

9

अपनी छवि को mipmap-xxhdpi के लिए ड्रा करने योग्य में ले जाएं। आपकी छवि बिटमैप प्रारूप में है, इसलिए आपको अपनी छवि को mipmap फ़ोल्डर में रखना चाहिए, फिर यह काम करेगा


1
AFAIK mipmap फ़ोल्डर केवल लॉन्चर आइकन के लिए है। मैंने इसे किसी और चीज के लिए इस्तेमाल नहीं किया है। देखें stackoverflow.com/a/28065664/4034572
अल्बर्ट विला केल्वो

हाँ, यह मेरे लिए काम किया। मेरे पास 1MB के आकार की छवियां थीं और मैंने उन्हें mipmap-xxhdpi में डाल दिया


3

यदि आप इस तरह से ग्लाइड में पिकासो परिवर्तन का उपयोग करते हैं।

पिकासो को हटाओ

Picasso.get().load(Uri.parse("url")).into(imageView)

चेंज ग्लाइड

Glide.with(context).load("url").into(imageView)

अधिक कुशल


पिकासो से ग्लाइड में स्विच करने के बाद भी मुझे त्रुटि मिल रही है। सैमसंग J6 फोन पर। और मोटो जेड 2 :(
रोहित सिंह

2

कुछ ऐसे परिदृश्य हैं जहाँ मूल बिटमैप को ImageViews, Photo Editing apps आदि में शामिल किया जाना चाहिए ...

जैसा कि बे ने ऊपर बताया है

android:hardwareAccelerated="false"

यूआई खराब होने के कारण खराब हो जाएगा, आप हार्डवेयर सेट कर सकते हैं केवल एक चयनित गतिविधि जहां उच्च रेस छवि तैयार की जाए

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

0

एंड्रॉइड के लिए कुशलतापूर्वक और आसानी से लोड करने के लिए आइकन फाइलें बहुत बड़ी हैं। Android अपने स्मार्ट एल्गोरिदम के साथ इसे पहचानता है।

आप asystat द्वारा अंतिम Android Resizer का उपयोग कर आइकन फ़ाइलों का आकार बदल सकते हैं । उन्हें "xhdpi" या निम्न आकार दें।

मौजूदा बड़ी आइकन फ़ाइलों पर ड्रा किए गए फ़ोटो को ड्रा करने योग्य या अधिलेखित करें।

फिर, आप कर रहे हैं।


0

यदि आप ग्लाइड का उपयोग कर रहे हैं और आप एक समय या कुछ छवियों पर 1k छवियों को लोड कर रहे हैं तो यह ग्लाइड का मुद्दा है या आप जो कुछ भी कर रहे हैं वह छवि दृश्य सेट करने के लिए उपयोग कर रहे हैं। आप इसे केवल ग्लाइड में स्केल प्रकार लागू करके हल कर सकते हैं।


0

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


कृपया अपने विचारों को साझा करने के लिए टिप्पणियों का उपयोग करें।
अजय सिवन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.