एंड्रॉइड कैनवस: बहुत बड़ा बिटमैप ड्राइंग


87

मैं Ubuntu 16.04 चला रहा हूं। और एंड्रॉइड स्टूडियो पर जब मैं एमुलेटर में अपना एप्लिकेशन चलाने की कोशिश करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

FATAL EXCEPTION: मुख्य प्रक्रिया: परियोजना का नाम यहाँ, PID: 2528 java.lang.RuntimeException: कैनवस: बहुत बड़े (216090000bytes) बिटमैप को खींचने की कोशिश कर रहा है। android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) android.graphics.Canvas.drawBitmap (Canvas.java.1415) पर android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable) पर क्लिक करें। widget.ImageView.onDraw (ImageView.java:1316) android.view.View.draw (View.java:17185) पर android.view.View.updateDisplayListIfDirty (View.java:16167) android.view.View.draw पर देखें (View.java:16951) android.view.ViewGroup.drawChild (ViewGroup.java:3727) पर android.view.ViewGroup.dispatchDraw (ViewGroup.java):
आदि...

मुझे अपने एमुलेटर पर काम करने के लिए कुछ हुप्स के माध्यम से दौड़ना पड़ा, फिर भी एक सी-लिंक बनाने की जरूरत थी ताकि मैं एमुलेटर को एएमडी से चला सकूं। यकीन नहीं होता अगर यह समस्या का हिस्सा है। और मेरे जीवन के लिए मैं समझ नहीं पा रहा हूं कि ऐसा क्यों होता है। मेरे समूह में ऐसे अन्य लोग हैं जो इस परियोजना का अनुकरण करते हैं जो एक ही अनुकरणीय फोन और एसडीके पर ठीक है।


क्या आपने बिटमैप को छोटे आकार में पढ़ने की कोशिश की है BitmapOption.inSampleSize?
— एल। स्विफ्टर


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

क्या यह केवल एमुलेटर या डिवाइस पर समान स्क्रीन आकार के साथ ही होता है?
— दिमित्री

जवाबों:


200

अपनी छवि को (hi-res) ड्रॉ करने योग्य-xxhdpi पर ले जाएं । लेकिन ऐप विकास में, आपको बड़ी छवि का उपयोग करने की आवश्यकता नहीं है। यह आपके एपीके फाइल साइज को बढ़ाएगा।


6
धन्यवाद, यह भी काम किया जब मेरी छवि केवल 500 केबी थी, लेकिन संकल्प बहुत अधिक था।
— ashishdhiman2007

1
एपीआई से चित्र लोड करते समय मुझे यह त्रुटि मिल रही है। उस मामले में क्या समाधान हो सकता है?
— रोहित सिंह

2
मैं Firebase Crashlytics में एक ही मुद्दे पर भाग गया, लेकिन इसमें सटीक फ़ाइल + लाइन कोड का उल्लेख नहीं है, इसलिए मुझे नहीं पता कि यह सटीक छवि क्या है जो इस दुर्घटना का कारण बन रही है। जाहिर है कि मेरी रेस फाइल में बहुत सारी छवियां हैं, मैं समस्याग्रस्त एक का पता कैसे लगा सकता हूं
— ravid rinek

15

इसका समाधान छवि को drawable/फ़ोल्डर से फ़ोल्डर में स्थानांतरित करना है drawable-xxhdpi/, जैसा कि दूसरों ने भी उल्लेख किया है।

लेकिन यह समझना भी महत्वपूर्ण है कि यह कुछ अजीब सुझाव वास्तव में मदद क्यों करता है:

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


2
क्या इसका मतलब है कि मैं drawable/निर्देशिका को हटा सकता हूं अगर मेरे पास अन्य drawable-xनिर्देशिकाओं में संपत्ति है ?
— कार्ल टेलर

14

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

    panel_IMG_back = (ImageView) findViewById(R.id.panel_IMG_back);
    Glide
            .with(this)
            .load(MyViewUtils.getImage(R.drawable.wallpaper)
            .into(panel_IMG_back);

6

उस समय समस्या हमारे मुख्य ऐप पर उपयोग की जाने वाली मुख्य छवि थी। छवि का वास्तविक आकार बहुत बड़ा था, इसलिए हमने इसे संकुचित कर दिया। तब यह एक आकर्षण की तरह काम करता था, गुणवत्ता में कोई हानि नहीं होती थी और ऐप एमुलेटर पर ठीक चलता था।


@BekaBot मूल प्रश्न थोड़ी देर पहले से था। लेकिन अगर मुझे सही से याद है तो हमने अपनी छवि को ऑनलाइन छवि कंप्रेसर के माध्यम से चलाया, और फिर अपने ऐप को फिर से चलाया और फिर यह ठीक चला। आशा है कि ये आपकी मदद करेगा।
— फ्रांसिस्को

3

मेरे पास यह मुद्दा भी था जब मैं लॉन्च_बैकगाउंड.एक्सएमएल के माध्यम से एंड्रॉइड ऐप में एक स्प्लैश स्क्रीन को जोड़ने की कोशिश कर रहा था। मुद्दा संकल्प था। यह बहुत अधिक था, इसलिए मेमोरी मेमोरी फ़ुटप्रिंट फट गया और ऐप को क्रैश करने का कारण बना, इसलिए इस त्रुटि का कारण है। तो बस अपनी छवि को एक साइट का उपयोग करके आकार दें जिसे मूल निवासी छवि बिल्डर कहा जाता है इसलिए मुझे ldpi, mdpi और बाकी सभी मिल गए और इसने मेरे लिए ठीक काम किया।


मेरा दिन बचाओ, वही मुद्दा।
— अब्दुल बासित ऋषि

2

इस त्रुटि के लिए दूसरों की तरह एक बड़ी छवि (1800px X 900px) थी जो कि ड्रॉएबल डायरेक्टरी में थी, मैंने इमेज को एडिट किया और फ़ोटोशॉप का उपयोग करके आनुपातिक रूप से आकार कम किया और यह काम किया ... !!


2

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

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

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

चेंज ग्लाइड

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

पिकासो की तुलना में अधिक कुशल ग्लाइड बड़े बिटमैप के लिए आकर्षित करते हैं


3
मुझे ग्लाइड में यही त्रुटि मिली, URL के माध्यम से छवि लोड और यह केवल 2 एमबी की छवि है।
— राजकुमार ढोलकिया

1

मैंने सिर्फ डायरेक्टरी ड्रॉएबल-एक्सएचडीपीआई बनाई (आप इसे अपनी जरूरत के अनुसार बदल सकते हैं) और उस डायरेक्टरी में सभी इमेजेस को पेस्ट कर सकते हैं।


0

मेरे मामले में मुझे एंड्रॉइड प्लेटफ़ॉर्म को निकालना और इसे फिर से जोड़ना था। कुछ अटक गया और मेरे सभी कोड को किसी अन्य ऐप में कॉपी करके एक आकर्षण की तरह काम किया - इसलिए प्लेटफॉर्म को हटाकर एंड्रॉइड के लिए बिल्ड को साफ करने का मेरा विचार।

cordova platform remove android
cordova platform add android

मुझे लगता है कि यह किसी प्रकार का सफाई है जिसे आपको समय-समय पर करना है :-(


0

यह ग्लाइड के साथ एक मुद्दा हो सकता है। जब आप कई छवियों को लोड करने का प्रयास कर रहे हैं तो इसका उपयोग करें और उनमें से कुछ बहुत बड़े हैं:

Glide.load("your image path")
                       .transform(
                               new MultiTransformation<>(
                                       new CenterCrop(),
                                       new RoundedCorners(
                                               holder.imgCompanyLogo.getResources()
                                                       .getDimensionPixelSize(R.dimen._2sdp)
                                       )
                               )
                       )
                       .error(R.drawable.ic_nfs_default)
                       .into(holder.imgCompanyLogo);
           }

0

इस समाधान ने मेरे लिए काम किया।

अपने मैनिफ़ेस्ट एप्लिकेशन टैग में इन पंक्तियों को जोड़ें

android:largeHeap="true"
android:hardwareAccelerated="false"

    

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