Android Canvas: dessin bitmap trop grand

87

J'utilise Ubuntu 16.04. Et sur Android Studio, lorsque j'essaye d'exécuter mon application dans l'émulateur, j'obtiens l'erreur suivante:

EXCEPTION FATALE: Processus principal: nom du projet ici, PID: 2528 java.lang.RuntimeException: Canvas: tentative de dessiner un bitmap trop grand (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:
etc...

J'ai dû parcourir quelques cercles pour que mon émulateur fonctionne, cependant, je devais créer un lien symbolique afin de pouvoir exécuter l'émulateur sur AMD. Je ne sais pas si cela fait partie du problème. Et pour la vie de moi, je ne peux pas comprendre pourquoi il continue à faire cela. Dans mon groupe, il y en a d'autres qui émulent le projet très bien sur le même téléphone émulé et le même SDK.

Francisco
la source
avez-vous essayé de lire le bitmap dans une taille plus petite en utilisant BitmapOption.inSampleSize?
L. Swifter
1
échantillonnez votre bitmap en utilisant ce developer.android.com/training/displaying-bitmaps/…
Nishant Verma
10
Dans mon cas, déplacer le bitmap splash (haute résolution) de drawable à drawable-xxhdpi était la solution. J'ai eu le même problème. Je ne soupçonnais pas que mon écran de démarrage était le problème, car il est affiché au démarrage de l'application, mais il s'est avéré que l'écran de démarrage est le problème. L'écran de démarrage dans mon cas a une résolution xxhdpi, et il a été placé par erreur dans le dossier drawable, au lieu de drawable-xxhdpi. Cela a amené Android à supposer que l'écran de démarrage avait une résolution mdpi et à redimensionner l'image à 3 * 3 fois sa taille requise et à essayer de créer une image bitmap.
Zubair Rehman
Cela se produit-il uniquement sur l'émulateur ou sur l'appareil avec la même taille d'écran?
Dmitry le

Réponses:

200

Déplacez votre image dans le dessin (haute résolution) vers drawable-xxhdpi . Mais dans le développement d'applications, vous n'avez pas besoin d'utiliser une grande image. Cela augmentera la taille de votre fichier APK.

Md Imran Choudhury
la source
6
Merci, cela a également fonctionné lorsque mon image ne faisait que 500 Ko, mais la résolution était bien trop élevée.
ashishdhiman2007
1
J'obtiens cette erreur lors du chargement d'images à partir d'une API. Quelle pourrait être une solution dans ce cas?
Rohit Singh
2
J'ai rencontré le même problème dans Firebase Crashlytics mais il ne mentionne pas le fichier exact + le code de ligne, donc je ne sais pas quelle est l'image exacte qui a causé ce crash. De toute évidence, il y a beaucoup d'images dans mon fichier res, comment puis-je localiser celle qui pose problème
ravid rinek
15

La solution consiste à déplacer l'image d'un drawable/dossier à un autre drawable-xxhdpi/, comme d'autres l'ont mentionné.

Mais il est important de comprendre également pourquoi cette suggestion un peu étrange aide réellement:

La raison est que le drawable/dossier existe depuis les premières versions d'Android et équivaut à drawable-mdpi. Lorsqu'une image qui se trouve uniquement dans un drawable/dossier est utilisée sur l' xxhdpiappareil, l'image potentiellement déjà grande est mise à l'échelle d'un facteur 3, ce qui peut dans certains cas provoquer une explosion de l'empreinte mémoire de l'image.

Nace
la source
2
Cela signifie-t-il que je peux supprimer le drawable/répertoire si j'ai l'actif dans d'autres drawable-xrépertoires?
Karl Taylor le
14

J'ai eu le même problème. Si vous essayez de télécharger une image trop grande sur certains appareils à basse résolution, l'application se réduira. Vous pouvez créer plusieurs images de différentes tailles (hdpi, xxdpi et plus) ou simplement utiliser une bibliothèque externe pour charger des images qui résolvent le problème rapidement et efficacement. J'ai utilisé la bibliothèque Glide (vous pouvez utiliser une autre bibliothèque comme 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
la source
6

Il s'avère que le problème était l'image principale que nous avons utilisée sur notre application à l'époque. La taille réelle de l'image était trop grande, nous l'avons donc compressée. Ensuite, cela a fonctionné comme un charme, aucune perte de qualité et l'application fonctionnait bien sur l'émulateur.

Francisco
la source
@BekaBot La question originale datait d'il y a quelque temps. Mais si je me souviens bien, nous avons simplement exécuté notre image via un compresseur d'images en ligne, puis réexécuté notre application, puis elle a bien fonctionné. J'espère que ça aide.
Francisco
3

J'ai également eu ce problème lorsque j'essayais d'ajouter un écran de démarrage à l'application Android via le launch_backgrgound.xml. le problème était la résolution. il était trop élevé, donc l'empreinte de la mémoire des images a explosé et a provoqué le blocage de l'application, d'où la raison de cette erreur. donc il suffit de redimensionner votre image en utilisant un site appelé constructeur d'image nativescript donc j'ai eu le ldpi, mdpi et tout le reste et cela a bien fonctionné pour moi.

williamjnrkdd
la source
sauve ma journée, même problème.
Abdul Basit Rishi le
2

Pour cette erreur, c'était comme d'autres l'ont dit une grande image (1800px X 900px) qui était dans le répertoire drawable, j'ai édité l'image et réduit la taille proportionnellement en utilisant Photoshop et cela a fonctionné ... !!

Ishimwe Aubain Consolateur
la source
2

si vous utilisez Picasso, changez pour Glide comme ça.

Supprimer picasso

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

Changer le glissement

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

Glide plus efficace que Picasso dessine sur une grande image bitmap

Deniz
la source
3
J'ai eu cette même erreur dans Glide, le chargement de l'image via l'URL et ce n'est que 2 Mo d'image.
Prince Dholakiya
1

Je viens de créer le répertoire drawable-xhdpi (vous pouvez le changer selon vos besoins) et copier-coller toutes les images dans ce répertoire.

Sourabh Chaudhary
la source
0

Dans mon cas, j'ai dû supprimer la plate-forme Android et l'ajouter à nouveau. Quelque chose s'est coincé et copier tout mon code dans une autre application a fonctionné comme un charme - d'où mon idée de nettoyer la version pour Android en supprimant la plate-forme.

cordova platform remove android
cordova platform add android

Je suppose que c'est une sorte de nettoyage que vous devez faire de temps en temps :-(

pieroxy
la source
0

Cela peut être un problème avec Glide. Utilisez ceci pendant que vous essayez de charger de nombreuses images et certaines d'entre elles sont très volumineuses:

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
la source
0

Cette solution a fonctionné pour moi.

Ajoutez ces lignes dans votre balise d' application Manifest

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

    
Abdul Basit Rishi
la source