Android Canvas: çok büyük bitmap çizme


97

Ubuntu 16.04 çalıştırıyorum. Ve Android Studio'da uygulamamı öykünücüde çalıştırmayı denediğimde aşağıdaki hatayı alıyorum:

ÖNEMLİ İSTİSNA: ana Süreç: proje adı burada, PID: 2528 java.lang.RuntimeException: Canvas: çok büyük (216090000byte) bitmap çizmeye çalışıyor. android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) at android.graphics.Canvas.drawBitmap (Canvas.java:1415) at android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:528) at android. android.view.View.draw (View.java:17185) at android.view.View.updateDisplayListIfDirty (View.java:16167) at android.view.View.draw'da widget.ImageView.onDraw (ImageView.java:1316) (View.java:16951) android.view.ViewGroup.drawChild (ViewGroup.java:3727) at android.view.ViewGroup.dispatchDraw (ViewGroup.java:
vb...

Öykünücümün çalışmasını sağlamak için bazı çemberlerden geçmek zorunda kaldım, ancak öykünücüyü AMD'de çalıştırabilmem için bir sym-link oluşturmam gerekiyordu. Bunun sorunun bir parçası olup olmadığından emin değilim. Ve hayatım boyunca neden bunu yapmaya devam ettiğini anlayamıyorum. Grubumda, aynı taklit edilmiş telefon ve SDK'da projeyi taklit eden başkaları da var.


bitmap'i kullanarak daha küçük bir boyutta okumayı denediniz BitmapOption.inSampleSizemi?
L. Swifter


11
Benim durumum, (yüksek çözünürlüklü) sıçrama bit eşlemini çekilebilirden çekilebilir xxhdpi'ye taşımak çözümdü. Ben de aynı sorunu yaşadım. Uygulama başlatıldığında görüntülendiği için açılış ekranımın sorun olduğundan şüphelenmedim, ancak açılış ekranının sorun olduğu ortaya çıktı. Benim durumumdaki açılış ekranı xxhdpi çözünürlüğüne sahip ve yanlışlıkla çekilebilir xxhdpi yerine çekilebilir klasöre yerleştirildi. Bu, Android'in açılış ekranının mdpi çözünürlüğüne sahip olduğunu varsaymasını ve görüntüyü gereken boyutun 3 * 3 katına ölçeklendirmesini ve bir bitmap oluşturmaya çalışmasını sağladı.
Zubair Rehman

Sadece emülatörde mi yoksa aynı ekran boyutuna sahip cihazda mı oluyor?
Dmitry

Yanıtlar:


209

(Hi-res) da resmi Taşı çekilebilir için çekilebilir-xxhdpi . Ancak uygulama geliştirmede büyük görsel kullanmanıza gerek yoktur. APK dosya boyutunuzu artıracaktır.


6
Teşekkürler, resmim yalnızca 500 kb olduğunda da işe yaradı, ancak çözünürlük çok yüksekti.
ashishdhiman2007

1
Bir API'den görüntüleri yüklerken bu hatayı alıyorum. Bu durumda bir çözüm ne olabilir?
Rohit Singh

4
Firebase Crashlytics'te de aynı sorunla karşılaştım ancak tam dosya + satır kodundan bahsetmiyor, bu yüzden bu çökmeye neden olan resmin tam olarak ne olduğunu bilmiyorum. Açıkçası res
dosyamda

19

Çözüm, diğerlerinin de bahsettiği gibi , görüntüyü drawable/klasörden klasöre taşımaktır drawable-xxhdpi/.

Ancak bu biraz tuhaf önerinin aslında neden yardımcı olduğunu anlamak da önemlidir :

Bunun nedeni, drawable/klasörün android'in eski sürümlerinden var olması ve eşdeğer olmasıdır drawable-mdpi. Aygıtta yalnızca drawable/klasörde bulunan bir görüntü kullanıldığında xxhdpi, potansiyel olarak zaten büyük olan görüntünün boyutu 3 kat büyütülür ve bu da bazı durumlarda görüntünün bellek ayak izinin patlamasına neden olabilir.


3
Bu drawable/, varlığı başka drawable-xdizinlerde bulundurursam dizini kaldırabileceğim anlamına mı geliyor ?
Karl Taylor

14

Ben de aynı sorunu yaşadım. Bazı düşük çözünürlüklü cihazlarda çok büyük bir resim yüklemeye çalışırsanız, uygulama kapanacaktır. Farklı boyutlarda (hdpi, xxdpi ve daha fazlası) birkaç görüntü oluşturabilir veya sorunu hızlı ve verimli bir şekilde çözen görüntüleri yüklemek için harici bir kitaplık kullanabilirsiniz. Glide kitaplığını kullandım (Picasso gibi başka bir kitaplık kullanabilirsiniz).

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

7

Sorunun, o sırada uygulamamızda kullandığımız ana resim olduğu ortaya çıktı. Resmin gerçek boyutu çok büyüktü, bu yüzden onu sıkıştırdık. Sonra bir cazibe gibi çalıştı, kalite kaybı olmadı ve uygulama emülatörde iyi çalıştı.


@BekaBot Orijinal soru bir süre önceydi. Ancak doğru hatırlıyorsam, resmimizi çevrimiçi bir görüntü sıkıştırıcıyla çalıştırdık ve ardından uygulamamızı yeniden çalıştırdık ve sonra sorunsuz çalıştı. Umarım bu yardımcı olur.
Francisco

3

Launch_backgrgound.xml aracılığıyla android uygulamasına bir açılış ekranı eklemeye çalışırken de bu sorunu yaşadım. sorun çözümdü. çok yüksekti, bu nedenle görüntü belleği ayak izi patladı ve uygulamanın çökmesine neden oldu, bu nedenle bu hatanın nedeni. bu yüzden nativescript image builder adlı bir site kullanarak resminizi yeniden boyutlandırın, böylece ldpi, mdpi ve diğer her şeyi aldım ve benim için iyi çalıştı.


günümü kurtar, aynı konu.
Abdul Basit Rishi

2

Çünkü bu hata başkalarının dediği gibi çekilebilir dizinde büyük bir resim (1800px X 900px) idi, resmi düzenledim ve photoshop kullanarak orantılı olarak boyutu küçülttüm ve işe yaradı ... !!


2

Picasso kullanırsanız bu şekilde Glide'a geçin.

Picasso'yu kaldır

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

Kaymayı Değiştir

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

Picasso'nun büyük bitmap çizmesinden daha verimli Glide


3
Glide'da aynı hatayı aldım, URL üzerinden resim yükleme ve yalnızca 2 MB resim.
Prens Dholakiya

1

Sadece drawable-xhdpi dizinini oluşturdum (ihtiyacınıza göre değiştirebilirsiniz) ve tüm resimleri kopyalayıp o dizine yapıştırdım.


1

Bu çözüm benim için çalıştı.

Manifest uygulama etiketinize bu satırları ekleyin

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

    


0

Benim durumumda android platformunu kaldırıp tekrar eklemem gerekiyordu. Bir şey takıldı ve tüm kodumu başka bir uygulamaya kopyalamak bir cazibe gibi çalıştı - bu nedenle platformu kaldırarak android için yapıyı temizleme fikrim.

cordova platform remove android
cordova platform add android

Sanırım zaman zaman yapmanız gereken bir tür temizlik :-(


0

Bu Glide ile ilgili bir sorun olabilir. Bunu birçok görüntüye yüklemeye çalışırken ve bazıları çok büyükken kullanın:

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

Bir xml veya vektör kullanmayı deneyinBir jpg veya png yerine varlığı .

Bunun nedeni istisna adının kendisinde oldukça açıktır, yani kaynağın çözünürlüğü oluşturulamayacak kadar büyüktür.

Https://svg2vector.com/ gibi çevrimiçi araçları kullanarak xml'ye png yapabilir VEYA resminizi çizilebilir xxhdpi klasörüne ekleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.