Android Canvas: menggambar bitmap terlalu besar

97

Saya menjalankan Ubuntu 16.04. Dan di Android Studio ketika saya mencoba menjalankan aplikasi saya di emulator saya mendapatkan kesalahan berikut:

PENGECUALIAN FATAL: Proses utama: dll ... nama proyek di sini, PID: 2528 java.lang.RuntimeException: Canvas: mencoba menggambar bitmap (216090000bytes) terlalu besar. di android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) di android.graphics.Canvas.drawBitmap (Canvas.java:1415) di android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:528) di android. widget.ImageView.onDraw (ImageView.java:1316) di android.view.View.draw (View.java:17185) di android.view.View.updateDisplayListIfDirty (View.java:16167) di android.view.View.draw (View.java:16951) di android.view.ViewGroup.drawChild (ViewGroup.java:3727) di android.view.ViewGroup.dispatchDraw (ViewGroup.java:

Saya memang harus melalui beberapa rintangan untuk membuat emulator saya berfungsi, namun perlu membuat sym-link sehingga saya dapat menjalankan emulator di AMD. Tidak yakin apakah ini bagian dari masalah. Dan untuk kehidupan saya, saya tidak mengerti mengapa ia terus melakukan ini. Di grup saya, ada orang lain yang meniru proyek dengan baik di ponsel dan SDK yang sama.

Francisco
sumber
Sudahkah Anda mencoba membaca bitmap dalam ukuran yang lebih kecil menggunakan BitmapOption.inSampleSize?
L. Swifter
1
contoh bitmap Anda menggunakan developer
ini.android.com/training/displaying-bitmaps/…
11
Saya kasus saya, memindahkan bitmap splash (hi-res) dari drawable ke drawable-xxhdpi adalah solusinya. Saya memiliki masalah yang sama. Saya tidak curiga layar splash saya menjadi masalah, karena itu ditampilkan ketika aplikasi dimulai, tetapi ternyata layar splash adalah masalahnya. Layar splash dalam kasus saya memiliki resolusi xxhdpi, dan itu salah ditempatkan di folder drawable, bukan drawable-xxhdpi. Ini membuat Android menganggap layar splash memiliki resolusi mdpi dan menskalakan gambar menjadi 3 * 3 kali ukuran yang diperlukan dan mencoba membuat bitmap.
Zubair Rehman
Apakah ini hanya terjadi di emulator atau di perangkat dengan ukuran layar yang sama juga?
Dmitry

Jawaban:

209

Pindahkan gambar Anda dalam (hi-res) ditarik ke ditarik-xxhdpi . Namun dalam pengembangan aplikasi, Anda tidak perlu menggunakan gambar berukuran besar. Ini akan meningkatkan ukuran file APK Anda.

Md Imran Choudhury
sumber
6
Terima kasih, itu juga berfungsi saat gambar saya hanya 500 kb, tetapi resolusinya terlalu tinggi.
ashishdhiman2007
1
Saya mendapatkan kesalahan ini saat memuat gambar dari API. Apa yang bisa menjadi solusi dalam kasus itu?
Rohit Singh
4
Saya mengalami masalah yang sama di Firebase Crashlytics tetapi tidak menyebutkan file + kode baris yang tepat, Jadi saya tidak tahu persis gambar apa yang menyebabkan kerusakan ini. Jelas ada banyak gambar di file res saya, bagaimana saya bisa menemukan yang bermasalah
ravid rinek
19

Solusinya adalah memindahkan gambar dari drawable/folder ke drawable-xxhdpi/folder, seperti yang telah disebutkan orang lain.

Tetapi penting juga untuk memahami mengapa saran yang agak aneh ini benar-benar membantu:

Alasannya adalah bahwa drawable/folder tersebut ada dari versi awal android dan setara dengan drawable-mdpi. Saat gambar yang hanya ada di drawable/folder digunakan pada xxhdpiperangkat, gambar yang berpotensi sudah besar ditingkatkan skalanya dengan faktor 3, yang kemudian dalam beberapa kasus dapat menyebabkan jejak memori gambar meledak.

Nace
sumber
3
Apakah ini berarti saya dapat menghapus drawable/direktori jika saya memiliki aset di drawable-xdirektori lain ?
Karl Taylor
14

Saya memiliki masalah yang sama. Jika Anda mencoba mengupload gambar yang terlalu besar di beberapa perangkat beresolusi rendah, aplikasi akan runtuh. Anda dapat membuat beberapa gambar dengan ukuran berbeda (hdpi, xxdpi, dan lainnya) atau cukup gunakan pustaka eksternal untuk memuat gambar yang menyelesaikan masalah dengan cepat dan efisien. Saya menggunakan perpustakaan Glide (Anda dapat menggunakan perpustakaan lain seperti Picasso).

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

Ternyata masalahnya adalah gambar utama yang kami gunakan di aplikasi kami saat itu. Ukuran gambar sebenarnya terlalu besar, jadi kami mengompresnya. Kemudian itu bekerja seperti pesona, tidak ada penurunan kualitas dan aplikasi berjalan dengan baik di emulator.

Francisco
sumber
@BekaBot Pertanyaan asli dari beberapa waktu lalu. Tetapi jika saya ingat dengan benar, kami baru saja menjalankan gambar kami melalui kompresor gambar online, lalu menjalankan kembali aplikasi kami dan kemudian berjalan dengan baik. Saya harap ini membantu.
Francisco
3

Saya juga mengalami masalah ini ketika mencoba menambahkan layar splash ke aplikasi android melalui launch_backgrgound.xml. masalahnya adalah resolusinya. itu terlalu tinggi sehingga jejak memori gambar meledak dan menyebabkan aplikasi macet maka alasan untuk kesalahan ini. jadi ubah ukuran gambar Anda menggunakan situs bernama pembuat gambar nativescript sehingga saya mendapatkan ldpi, mdpi, dan yang lainnya dan itu berfungsi dengan baik untuk saya.

williamjnrkdd.dll
sumber
selamatkan hariku, masalah yang sama.
Abdul Basit Rishi
2

Untuk kesalahan ini seperti orang lain mengatakan gambar besar (1800px X 900px) yang ada di direktori drawable, saya mengedit gambar dan memperkecil ukurannya secara proporsional menggunakan photoshop dan berhasil ... !!

Ishimwe Aubain Consolateur
sumber
2

jika Anda menggunakan Picasso, ubah ke Glide seperti ini.

Hapus picasso

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

Ubah Glide

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

Meluncur yang lebih efisien daripada gambar Picasso ke bitmap besar

Deniz
sumber
3
Saya mendapat kesalahan yang sama di Glide, gambar memuat melalui URL dan itu hanya 2 MB gambar.
Pangeran Dholakiya
1

Saya baru saja membuat direktori drawable-xhdpi (Anda dapat mengubahnya sesuai kebutuhan Anda) dan menyalin menempel semua gambar ke direktori itu.

Sourabh Chaudhary
sumber
1

Solusi ini berhasil untuk saya.

Tambahkan baris ini di tag aplikasi Manifest Anda

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

    
Abdul Basit Resi
sumber
0

Dalam kasus saya, saya harus menghapus platform android dan menambahkannya lagi. Sesuatu macet dan menyalin semua kode saya ke aplikasi lain bekerja seperti pesona - karenanya ide saya untuk membersihkan build untuk android dengan menghapus platform.

cordova platform remove android
cordova platform add android

Saya rasa itu semacam pembersihan yang harus Anda lakukan dari waktu ke waktu :-(

pieroxy
sumber
0

Ini bisa menjadi masalah dengan Glide. Gunakan ini saat Anda mencoba memuat ke banyak gambar dan beberapa di antaranya sangat besar:

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);
           }
Deepak Rajput
sumber
0

Coba gunakan aset xml atau vektor daripada jpg atau png.

Alasannya cukup jelas pada nama pengecualian itu sendiri, yaitu resolusi sumber daya terlalu besar untuk dirender.

Anda dapat png ke xml menggunakan alat online seperti https://svg2vector.com/ ATAU menambahkan gambar Anda ke folder drawable-xxhdpi.

Jayant Kapila
sumber