Android Canvas: การวาดบิตแมปที่ใหญ่เกินไป


97

ฉันใช้ Ubuntu 16.04 และบน Android Studio เมื่อฉันพยายามเรียกใช้แอปพลิเคชันในโปรแกรมจำลองฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อยกเว้นของ FATAL: กระบวนการหลัก: ชื่อโครงการที่นี่, PID: 2528 java.lang.RuntimeException: Canvas: พยายามวาดบิตแมปขนาดใหญ่เกินไป (216090000bytes) ที่ android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) ที่ android.graphics.Canvas.drawBitmap (Canvas.java:1415) ที่ android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:528) ที่ android 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:
ฯลฯ ...

ฉันต้องวิ่งผ่านห่วงเพื่อให้โปรแกรมจำลองของฉันทำงานได้อย่างไรก็ตามจำเป็นต้องสร้าง sym-link เพื่อให้ฉันสามารถเรียกใช้โปรแกรมจำลองบน AMD ได้ ไม่แน่ใจว่านี่เป็นส่วนหนึ่งของปัญหาหรือไม่ และสำหรับชีวิตของฉันฉันคิดไม่ออกว่าทำไมมันถึงทำเช่นนี้ต่อไป ในกลุ่มของฉันมีคนอื่น ๆ ที่เลียนแบบโครงการได้ดีบนโทรศัพท์จำลองและ SDK เดียวกัน


คุณได้พยายามอ่านบิตแมปในขนาดที่เล็กลงโดยใช้BitmapOption.inSampleSizeหรือไม่?
L. Swifter

1
ตัวอย่างบิตแมปของคุณโดยใช้developer.android.com/training/displaying-bitmaps/…
Nishant Verma

11
ในกรณีของฉันการย้ายบิตแมปสแปลช (ความละเอียดสูง) จาก drawable เป็น drawable-xxhdpi เป็นวิธีแก้ปัญหา ผมมีปัญหาเดียวกัน. ฉันไม่ได้สงสัยว่าหน้าจอเริ่มต้นของฉันเป็นปัญหาเนื่องจากมันจะปรากฏขึ้นเมื่อแอปเริ่มทำงาน แต่ปรากฎว่าหน้าจอเริ่มต้นเป็นปัญหา หน้าจอสแปลชในเคสของฉันมีความละเอียด xxhdpi และวางไว้ในโฟลเดอร์ที่วาดได้โดยไม่ถูกต้องแทนที่จะเป็น drawable-xxhdpi สิ่งนี้ทำให้ Android ถือว่าหน้าจอเริ่มต้นมีความละเอียด mdpi และปรับขนาดภาพเป็น 3 * 3 เท่าของขนาดที่ต้องการและพยายามสร้างบิตแมป
Zubair Rehman

มันเกิดขึ้นเฉพาะบนโปรแกรมจำลองหรือบนอุปกรณ์ที่มีขนาดหน้าจอเดียวกันด้วยหรือไม่?
Dmitry

คำตอบ:


209

ย้ายภาพของคุณใน (ความละเอียดสูง) drawableเพื่อdrawable-xxhdpi แต่ในการพัฒนาแอพคุณไม่จำเป็นต้องใช้รูปภาพขนาดใหญ่ มันจะเพิ่มขนาดไฟล์ APK ของคุณ


6
ขอบคุณที่ใช้งานได้เมื่อภาพของฉันมีขนาดเพียง 500 kb แต่ความละเอียดสูงเกินไป
ashishdhiman2007

1
ฉันได้รับข้อผิดพลาดนี้ขณะโหลดรูปภาพจาก API อะไรคือทางออกในกรณีนั้น?
Rohit Singh

4
ฉันพบปัญหาเดียวกันในFirebase Crashlyticsแต่ไม่ได้กล่าวถึงไฟล์ + รหัสบรรทัดที่แน่นอนดังนั้นฉันจึงไม่รู้ว่าภาพใดที่ทำให้เกิดข้อขัดข้องนี้ เห็นได้ชัดว่ามีภาพจำนวนมากในไฟล์ res ของฉันฉันจะค้นหาภาพที่มีปัญหาได้อย่างไร
ravid rinek

19

วิธีแก้ปัญหาคือการย้ายภาพจากdrawable/โฟลเดอร์ไปยังdrawable-xxhdpi/โฟลเดอร์ดังที่คนอื่นกล่าวถึง

แต่สิ่งสำคัญคือต้องเข้าใจด้วยว่าทำไมคำแนะนำแปลก ๆ นี้จึงช่วยได้จริง:

เหตุผลก็คือdrawable/โฟลเดอร์นี้มีมาจาก Android เวอร์ชันแรก ๆ และเทียบเท่ากับdrawable-mdpiไฟล์. เมื่อมีการใช้รูปภาพที่อยู่ในdrawable/โฟลเดอร์บนxxhdpiอุปกรณ์เท่านั้นภาพที่มีขนาดใหญ่อยู่แล้วจะถูกเพิ่มสเกลโดยปัจจัย 3 ซึ่งในบางกรณีอาจทำให้รอยเท้าหน่วยความจำของรูปภาพระเบิดได้


3
หมายความว่าฉันสามารถลบdrawable/ไดเร็กทอรีได้drawable-xหรือไม่หากฉันมีเนื้อหาในไดเร็กทอรีอื่น
Karl Taylor

14

ผมมีปัญหาเดียวกัน. หากคุณพยายามอัปโหลดรูปภาพที่มีขนาดใหญ่เกินไปบนอุปกรณ์ที่มีความละเอียดต่ำแอปจะยุบ คุณสามารถสร้างภาพหลายขนาดที่แตกต่างกัน (hdpi, xxdpi และอื่น ๆ ) หรือใช้ไลบรารีภายนอกเพื่อโหลดภาพที่แก้ปัญหาได้อย่างรวดเร็วและมีประสิทธิภาพ ฉันใช้ไลบรารี Glide (คุณสามารถใช้ไลบรารีอื่นเช่น Picasso)

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

7

ปรากฎว่าปัญหาคือภาพหลักที่เราใช้ในแอปในขณะนั้น ขนาดจริงของภาพใหญ่เกินไปเราจึงบีบอัด จากนั้นก็ใช้งานได้อย่างมีเสน่ห์ไม่มีการสูญเสียคุณภาพและแอปทำงานได้ดีบนโปรแกรมจำลอง


@BekaBot คำถามเดิมเมื่อสักครู่ที่ผ่านมา แต่ถ้าฉันจำได้อย่างถูกต้องเราแค่เรียกใช้ภาพของเราผ่านโปรแกรมอัดภาพออนไลน์จากนั้นเรียกใช้แอปของเราอีกครั้งจากนั้นก็ทำงานได้ดี ฉันหวังว่านี่จะช่วยได้.
Francisco

3

ฉันมีปัญหานี้เช่นกันเมื่อฉันพยายามเพิ่มหน้าจอเริ่มต้นในแอพ Android ผ่าน launch_backgrgound.xml ปัญหาคือการแก้ไข มันสูงเกินไปจนรอยเท้าหน่วยความจำภาพระเบิดและทำให้แอพขัดข้องด้วยเหตุนี้จึงเกิดข้อผิดพลาด ดังนั้นเพียงแค่ปรับขนาดรูปภาพของคุณโดยใช้ไซต์ที่เรียกว่าตัวสร้างรูปภาพ nativescript ดังนั้นฉันจึงได้ ldpi, mdpi และส่วนที่เหลือทั้งหมดและมันก็ใช้ได้ดีสำหรับฉัน


บันทึกวันของฉันปัญหาเดียวกัน
อับดุลบาสิตฤษี

2

สำหรับข้อผิดพลาดนี้ก็เหมือนกับที่คนอื่นพูดว่าเป็นภาพขนาดใหญ่ (1800px X 900px) ซึ่งอยู่ในไดเร็กทอรีที่วาดได้ฉันแก้ไขรูปภาพและลดขนาดตามสัดส่วนโดยใช้ photoshop และมันก็ใช้ได้ ... !!


2

ถ้าคุณใช้ Picasso ให้เปลี่ยนเป็น Glide เช่นนี้

ลบ picasso

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

เปลี่ยนร่อน

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

Glide มีประสิทธิภาพมากกว่า Picasso วาดเป็นบิตแมปขนาดใหญ่


3
ฉันได้รับข้อผิดพลาดเดียวกันนี้ใน Glide โหลดรูปภาพผ่าน URL และเป็นเพียง 2 MB ของภาพ
Prince Dholakiya

1

ฉันเพิ่งสร้างไดเร็กทอรี drawable-xhdpi (คุณสามารถเปลี่ยนได้ตามความต้องการของคุณ) และคัดลอกภาพทั้งหมดไปวางในไดเร็กทอรีนั้น




0

ในกรณีของฉันฉันต้องลบแพลตฟอร์ม Android และเพิ่มอีกครั้ง มีบางอย่างติดขัดและการคัดลอกรหัสทั้งหมดของฉันไปยังแอปอื่นทำงานได้อย่างมีเสน่ห์ดังนั้นความคิดของฉันในการทำความสะอาดบิลด์สำหรับ Android โดยการลบแพลตฟอร์ม

cordova platform remove android
cordova platform add android

ฉันเดาว่ามันเป็นการล้างบางอย่างที่คุณต้องทำเป็นครั้งคราว :-(


0

นี่อาจเป็นปัญหากับ Glide ใช้สิ่งนี้ในขณะที่คุณพยายามโหลดรูปภาพจำนวนมากและบางภาพมีขนาดใหญ่มาก

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

ลองใช้xmlหรือเนื้อหาเวกเตอร์แทน jpg หรือ png

เหตุผลค่อนข้างชัดเจนในชื่อข้อยกเว้นนั่นคือความละเอียดของทรัพยากรมีขนาดใหญ่เกินไปที่จะแสดงผล

คุณสามารถ png เป็น xml โดยใช้เครื่องมือออนไลน์เช่นhttps://svg2vector.com/หรือเพิ่มรูปภาพของคุณในโฟลเดอร์ drawable-xxhdpi

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.