Android Canvas: disegno bitmap troppo grande


97

Uso Ubuntu 16.04. E su Android Studio quando provo a eseguire la mia applicazione nell'emulatore ottengo il seguente errore:

ECCEZIONE FATALE: processo principale: nome del progetto qui, PID: 2528 java.lang.RuntimeException: Canvas: tentativo di disegnare una bitmap troppo grande (216090000 byte). su android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) su android.graphics.Canvas.drawBitmap (Canvas.java:1415) su android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:528) su android. widget.ImageView.onDraw (ImageView.java:1316) su android.view.View.draw (View.java:17185) su android.view.View.updateDisplayListIfDirty (View.java:16167) su android.view.View.draw (View.java:16951) su android.view.ViewGroup.drawChild (ViewGroup.java:3727) su android.view.ViewGroup.dispatchDraw (ViewGroup.java:
eccetera...

Tuttavia, ho dovuto eseguire alcuni passaggi per far funzionare il mio emulatore, necessario per creare un collegamento simbolico in modo da poter eseguire l'emulatore su AMD. Non sono sicuro che questo sia parte del problema. E per la vita di me non riesco a capire perché continua a farlo. Nel mio gruppo ci sono altri che emulano il progetto perfettamente sullo stesso telefono e SDK emulato.


hai provato a leggere la bitmap in una dimensione più piccola usando BitmapOption.inSampleSize?
L. Swifter


11
Nel mio caso, spostare la bitmap splash (ad alta risoluzione) da drawable a drawable-xxhdpi è stata la soluzione. Ho avuto lo stesso problema. Non sospettavo che la mia schermata iniziale fosse il problema, poiché viene visualizzata all'avvio dell'app, ma si è scoperto che la schermata iniziale è il problema. La schermata iniziale nel mio caso ha una risoluzione xxhdpi ed è stata erroneamente collocata nella cartella drawable, invece di drawable-xxhdpi. Ciò ha fatto sì che Android presumesse che la schermata iniziale avesse una risoluzione mdpi e ridimensionasse l'immagine a 3 * 3 volte la dimensione richiesta e provasse a creare una bitmap.
Zubair Rehman

Succede solo sull'emulatore o anche sul dispositivo con le stesse dimensioni dello schermo?
Dmitry

Risposte:


209

Sposta la tua immagine nel disegnabile (ad alta risoluzione) in drawable-xxhdpi . Ma nello sviluppo di app, non è necessario utilizzare immagini di grandi dimensioni. Aumenterà la dimensione del file APK.


6
Grazie, funzionava anche quando la mia immagine era di soli 500 kb, ma la risoluzione era troppo alta.
ashishdhiman2007

1
Ricevo questo errore durante il caricamento delle immagini da un'API. Quale potrebbe essere una soluzione in quel caso?
Rohit Singh

4
Ho riscontrato lo stesso problema in Firebase Crashlytics ma non menziona il file esatto + il codice di linea, quindi non so quale sia l'immagine esatta che causa questo arresto anomalo. Ovviamente ci sono molte immagini nel mio file res, come posso individuare quella problematica
ravid rinek

19

La soluzione è spostare l'immagine da una drawable/cartella all'altra drawable-xxhdpi/, come hanno già detto anche altri.

Ma è importante anche capire perché questo suggerimento un po 'strano aiuta effettivamente:

Il motivo è che la drawable/cartella esiste dalle prime versioni di Android ed è equivalente a drawable-mdpi. Quando un'immagine che si trova solo nella drawable/cartella viene utilizzata sul xxhdpidispositivo, l'immagine potenzialmente già grande viene ingrandita di un fattore 3, che in alcuni casi può causare l'esplosione dell'impronta di memoria dell'immagine.


3
Questo significa che posso rimuovere la drawable/directory se ho l'asset in altre drawable-xdirectory?
Karl Taylor

14

Ho avuto lo stesso problema. Se provi a caricare un'immagine troppo grande su alcuni dispositivi a bassa risoluzione, l'app verrà compressa. È possibile creare più immagini di dimensioni diverse (hdpi, xxdpi e altro) o semplicemente utilizzare una libreria esterna per caricare immagini che risolvono il problema in modo rapido ed efficiente. Ho usato la libreria Glide (puoi usare un'altra libreria come 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

Si è scoperto che il problema era l'immagine principale che abbiamo usato sulla nostra app in quel momento. La dimensione effettiva dell'immagine era troppo grande, quindi l'abbiamo compressa. Quindi ha funzionato a meraviglia, nessuna perdita di qualità e l'app ha funzionato bene sull'emulatore.


@BekaBot La domanda originale era di qualche tempo fa. Ma se ricordo bene, abbiamo semplicemente eseguito la nostra immagine attraverso un compressore di immagini online, quindi abbiamo rieseguito la nostra app e poi ha funzionato bene. Spero che possa aiutare.
Francisco

3

Ho riscontrato questo problema anche quando stavo cercando di aggiungere una schermata iniziale all'app Android tramite launch_backgrgound.xml. il problema era la risoluzione. era troppo alto, quindi l'impronta della memoria delle immagini è esplosa e ha causato l'arresto anomalo dell'app, quindi il motivo di questo errore. quindi ridimensiona la tua immagine usando un sito chiamato generatore di immagini nativescript così ho ottenuto ldpi, mdpi e tutto il resto e ha funzionato bene per me.


salva la mia giornata, stesso problema.
Abdul Basit Rishi

2

Per questo errore era come altri hanno detto una grande immagine (1800px X 900px) che era nella directory disegnabile, ho modificato l'immagine e ridotto le dimensioni proporzionalmente usando Photoshop e ha funzionato ... !!


2

se usi Picasso cambia in Glide in questo modo.

Rimuovi picasso

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

Cambia planata

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

Scorrimento più efficiente rispetto a Picasso per disegnare su bitmap di grandi dimensioni


3
Ho ricevuto lo stesso errore in Glide, caricamento dell'immagine tramite URL ed è solo 2 MB di immagine.
principe Dholakiya,

1

Ho appena creato la directory drawable-xhdpi (puoi cambiarla in base alle tue esigenze) e copiare tutte le immagini incollate in quella directory.


1

Questa soluzione ha funzionato per me.

Aggiungi queste righe nel tag dell'applicazione Manifest

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

    


0

Nel mio caso ho dovuto rimuovere la piattaforma Android e aggiungerla di nuovo. Qualcosa si è bloccato e la copia di tutto il mio codice in un'altra app ha funzionato a meraviglia, da qui la mia idea di ripulire la build per Android rimuovendo la piattaforma.

cordova platform remove android
cordova platform add android

Immagino sia una sorta di pulizia che devi fare di tanto in tanto :-(


0

Questo può essere un problema con Glide. Usalo mentre stai cercando di caricare molte immagini e alcune di esse sono molto grandi:

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

Prova a utilizzare un xml o un vettore risorsa invece di un jpg o png.

Il motivo è abbastanza ovvio nel nome dell'eccezione stessa, ovvero la risoluzione della risorsa è troppo grande per il rendering.

Puoi png in xml usando strumenti online come https://svg2vector.com/ OPPURE aggiungi la tua immagine alla cartella drawable-xxhdpi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.