Android Canvas: Zeichnen einer zu großen Bitmap

93

Ich verwende Ubuntu 16.04. Und unter Android Studio wird beim Versuch, meine Anwendung im Emulator auszuführen, die folgende Fehlermeldung angezeigt:

FATAL EXCEPTION: Hauptprozess: Projektname hier, PID: 2528 java.lang.RuntimeException: Canvas: Es wird versucht, eine zu große Bitmap (216090000 Byte) zu zeichnen. at android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) at android.graphics.Canvas.drawBitmap (Canvas.java:1415) at android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.j. widget.ImageView.onDraw (ImageView.java:1316) unter android.view.View.draw (View.java:17185) unter android.view.View.updateDisplayListIfDirty (View.java:16167) unter android.view.View.draw (View.java:16951) unter android.view.ViewGroup.drawChild (ViewGroup.java:3727) unter android.view.ViewGroup.dispatchDraw (ViewGroup.java:
usw...

Ich musste einige Rahmen durchlaufen, um meinen Emulator zum Laufen zu bringen, musste jedoch einen Sym-Link erstellen, damit ich den Emulator auf AMD ausführen kann. Ich bin mir nicht sicher, ob dies Teil des Problems ist. Und für mein Leben kann ich mir nicht vorstellen, warum es das weiterhin tut. In meiner Gruppe gibt es andere, die das Projekt auf demselben emulierten Telefon und SDK problemlos emulieren.

Francisco
quelle
Haben Sie versucht, die Bitmap in einer kleineren Größe mit zu lesen BitmapOption.inSampleSize?
L. Swifter
1
Probieren Sie Ihre Bitmap mit diesem developer.android.com/training/displaying-bitmaps/…
Nishant Verma
11
In meinem Fall war es die Lösung, die (hochauflösende) Splash-Bitmap von drawable nach drawable-xxhdpi zu verschieben. Ich hatte das gleiche Problem. Ich habe nicht vermutet, dass mein Begrüßungsbildschirm das Problem ist, da er beim Starten der App angezeigt wird, aber es stellte sich heraus, dass der Begrüßungsbildschirm das Problem ist. Der Begrüßungsbildschirm hat in meinem Fall eine Auflösung von xxhdpi und wurde fälschlicherweise im Zeichenordner anstelle von drawable-xxhdpi abgelegt. Dies ließ Android davon ausgehen, dass der Begrüßungsbildschirm eine MDPI-Auflösung hatte, und skalierte das Bild auf das 3 * 3-fache der erforderlichen Größe und versuchte, eine Bitmap zu erstellen.
Zubair Rehman
Kommt es nur auf dem Emulator oder auf dem Gerät mit der gleichen Bildschirmgröße vor?
Dmitry

Antworten:

205

Verschieben Sie Ihr Bild im ( hochauflösenden ) Zeichen nach Zeichen-xxhdpi . Bei der App-Entwicklung müssen Sie jedoch kein großes Bild verwenden. Dadurch wird Ihre APK-Dateigröße erhöht.

Md Imran Choudhury
quelle
6
Danke, das hat auch funktioniert, als mein Bild nur 500 KB groß war, aber die Auflösung viel zu hoch war.
ashishdhiman2007
1
Ich erhalte diesen Fehler beim Laden von Bildern von einer API. Was könnte in diesem Fall eine Lösung sein?
Rohit Singh
3
Ich bin in Firebase Crashlytics auf dasselbe Problem gestoßen, aber es wird nicht der genaue Datei- und Zeilencode erwähnt. Daher weiß ich nicht, welches Bild genau diesen Absturz verursacht. Offensichtlich gibt es viele Bilder in meinem res - Datei, wie kann ich die problematische orten
Ravid rinek
15

Die Lösung besteht darin, das Bild von drawable/Ordner zu drawable-xxhdpi/Ordner zu verschieben, wie auch andere erwähnt haben.

Es ist aber wichtig zu verstehen, warum dieser etwas seltsame Vorschlag tatsächlich hilft:

Der Grund ist, dass der drawable/Ordner aus früheren Versionen von Android existiert und äquivalent zu ist drawable-mdpi. Wenn ein Bild, das sich nur in einem drawable/Ordner befindet, auf dem xxhdpiGerät verwendet wird, wird das möglicherweise bereits große Bild um den Faktor 3 hochskaliert, was in einigen Fällen dazu führen kann, dass der Speicherbedarf des Bildes explodiert.

Nace
quelle
3
Bedeutet dies, dass ich das drawable/Verzeichnis entfernen kann, wenn ich das Asset in anderen drawable-xVerzeichnissen habe?
Karl Taylor
14

Ich hatte das gleiche Problem. Wenn Sie versuchen, ein Bild hochzuladen, das auf einigen Geräten mit niedriger Auflösung zu groß ist, wird die App reduziert. Sie können mehrere Bilder unterschiedlicher Größe (hdpi, xxdpi und mehr) erstellen oder einfach eine externe Bibliothek verwenden, um Bilder zu laden, die das Problem schnell und effizient lösen. Ich habe die Glide-Bibliothek verwendet (Sie können eine andere Bibliothek wie Picasso verwenden).

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

Es stellte sich heraus, dass das Problem das Hauptbild war, das wir zu dieser Zeit in unserer App verwendet haben. Die tatsächliche Größe des Bildes war zu groß, daher haben wir es komprimiert. Dann funktionierte es wie ein Zauber, kein Qualitätsverlust und die App lief gut auf dem Emulator.

Francisco
quelle
@BekaBot Die ursprüngliche Frage stammt von vor einiger Zeit. Aber wenn ich mich richtig erinnere, haben wir unser Bild einfach über einen Online-Bildkompressor ausgeführt und dann unsere App erneut ausgeführt, und dann lief es einwandfrei. Ich hoffe das hilft.
Francisco
3

Ich hatte auch dieses Problem, als ich versuchte, der Android-App über die Datei launch_backgrgound.xml einen Begrüßungsbildschirm hinzuzufügen. Das Problem war die Lösung. Es war zu hoch, sodass der Speicherbedarf des Bildspeichers explodierte und die App abstürzte, weshalb dieser Fehler aufgetreten ist. Ändern Sie einfach die Größe Ihres Bildes mithilfe einer Site namens Nativescript Image Builder, damit ich das ldpi, mdpi und den Rest bekomme und es für mich gut funktioniert.

williamjnrkdd
quelle
rette meinen Tag, das gleiche Problem.
Abdul Basit Rishi
2

Für diesen Fehler wurde wie andere gesagt ein großes Bild (1800px x 900px), das sich in einem zeichnbaren Verzeichnis befand, ich habe das Bild bearbeitet und die Größe proportional mit Photoshop reduziert und es hat funktioniert ... !!

Ishimwe Aubain Consolateur
quelle
2

Wenn Sie Picasso verwenden, wechseln Sie wie folgt zu Glide.

Picasso entfernen

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

Glide ändern

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

Effizienter Glide als Picasso zeichnen auf große Bitmap

Deniz
quelle
3
Ich habe den gleichen Fehler in Glide, Bildladen über URL und es sind nur 2 MB Bild.
Prinz Dholakiya
1

Ich habe gerade das Verzeichnis drawable-xhdpi erstellt (Sie können es nach Bedarf ändern) und alle Bilder in dieses Verzeichnis kopiert.

Sourabh Chaudhary
quelle
1

Diese Lösung hat bei mir funktioniert.

Fügen Sie diese Zeilen in Ihr Manifest- Anwendungs- Tag ein

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

    
Abdul Basit Rishi
quelle
0

In meinem Fall musste ich die Android-Plattform entfernen und erneut hinzufügen. Etwas blieb hängen und das Kopieren meines gesamten Codes in eine andere App funktionierte wie ein Zauber - daher meine Idee, den Build für Android durch Entfernen der Plattform zu bereinigen.

cordova platform remove android
cordova platform add android

Ich denke, es ist eine Art Bereinigung, die Sie von Zeit zu Zeit durchführen müssen :-(

Pieroxy
quelle
0

Dies kann ein Problem mit Glide sein. Verwenden Sie diese Option, während Sie versuchen, auf viele Bilder zu laden, von denen einige sehr groß sind:

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
quelle
0

Versuchen Sie, ein XML- oder ein Vektor- Asset anstelle eines JPG oder PNG zu verwenden.

Der Grund liegt im Ausnahmenamen selbst auf der Hand, dh die Auflösung der Ressource ist zu groß zum Rendern.

Sie können mit Online-Tools wie https://svg2vector.com/ eine PNG-Datei für XML erstellen oder Ihr Bild dem Ordner drawable-xxhdpi hinzufügen.

Jayant Kapila
quelle