“Bitmap trop volumineux pour être envoyé dans une texture”
Je suis le chargement d'une image bitmap dans une ImageView, et de voir cette erreur. Je déduis de cette limite se rapporte à une limite de taille pour le matériel OpenGL textures (2048x2048). L'image que j'ai besoin de charger est un pinch-zoom de l'image d'environ 4000 pixels de haut.
J'ai essayé de désactiver l'accélération matérielle dans le manifeste, mais pas de joie.
<application
android:hardwareAccelerated="false"
....
>
Est-il possible de charger une image de plus de 2048 pixels dans une ImageView?
- Pour ceux qui cherchent ici, n'oubliez pas de placer votre image dans un défilement de l'affichage si vous voulez qu'il soit de défilement. Qui va se débarrasser de l'erreur. J'ai perdu un certain temps avant de réaliser que c'était mon problème.
- Pour ceux qui cherchent à afficher des images de grande taille tout en gardant la qualité de l'image, reportez-vous à la bibliothèque dans @stoefln réponse ci-dessous. Je l'ai utilisé et il est utile de donner un essai. Certainement mieux que
inSampleSize
approche. - Pour moi, travailler avec une miniature de l'image d'origine est ce qui s'est débarrassé de l'avertissement: stackoverflow.com/a/6228188/1617737
- Coup réponse actuelle ne fonctionne pas dans votre cas? Si non, veuillez donner des précisions concernant le problème que vous rencontrés dans le contexte de cette question?
- Expliquer votre problème spécifique. Quelle taille d'image, ce dispositif? etc. "Cette question n'a pas reçu suffisamment d'attention" vraiment? Après 4 ans et 15 Réponses et près de 74k vues?? Si vous êtes en essayant de donner la Prime aux anciens accepté de Répondre, ils doivent re-post (après Bounty commencé) pour se qualifier.
- hey @VC.Un - c'est une chose étrange à obtenez travaillé jusqu'à à propos de mon homme. Je devrais avoir cliqué sur "la Récompense de réponse existant". Personne ne cherche péniblement en appuyant sur le "meilleur" sur cette SORTE de pop-up, parce que c'est idiot 🙂 tout est résolu maintenant que j'ai cliqué sur le bounty. Cheers!!
- pas de soucis. Il est bon de récompenser les méritants Réponse. Ne sais pas si votre question a une touche unique... j'ai vu le système de "manger" rep en rien si pas remis correctement. Ne connaissais pas toute SORTE de pop-up (qui n'ont pas encore mis mon propre bounty)... Tout bon.
- Je suis désolé, j'ai cliqué sur le mauvais bouton et a provoqué une timewaste! @VC.Un homme Acclamations!!
- J'essaie de toujours payer des primes (je n'aime pas la collecte de points). Je suppose que, si vous cliquez sur "mon profil", puis les primes, @VC.Vous verrez beaucoup de très grande QA de au fil des années !!!!!!!!!!!!!!!
Vous devez vous connecter pour publier un commentaire.
Tous rendu est basé sur OpenGL, donc non, vous ne pouvez pas aller au delà de cette limite (
GL_MAX_TEXTURE_SIZE
dépend de l'appareil, mais le minimum est de 2048x2048 pixels, de sorte que toute image inférieure à 2048x2048 sera adaptée).Avec de telles images, si vous souhaitez faire un zoom avant, et dans un mobile, vous devez configurer un système similaire à ce que vous voyez dans google maps par exemple. Avec le diviser l'image en plusieurs morceaux, et plusieurs définitions.
Ou vous pouvez réduire l'échelle de l'image avant de l'afficher (voir user1352407 réponse sur cette question).
Et aussi, attention à bien le dossier dans lequel vous mettez l'image, Android peut automatiquement à l'échelle des images. Jetez un oeil à Pilot_51 réponse ci-dessous sur cette question.
Ce n'est pas une réponse directe à la question (le chargement des images >2048), mais une solution possible pour toute victime de l'erreur.
Dans mon cas, l'image est plus petite que 2048 dans les deux dimensions (1280x727 pour être exact), et la question a été spécialement connu sur un Galaxy Nexus. L'image a été dans le
drawable
dossier et aucun de la qualification des dossiers. Android suppose un drawable sans une densité qualificatif sont mdpi et échelles vers le haut ou vers le bas pour les autres densités, dans ce cas, l'échelle 2x pour xhdpi. Déplacer le coupable de l'image àdrawable-nodpi
pour empêcher la mise à l'échelle résolu le problème.drawable
essentiellement cachédrawable-mdpi
dossier. Cela explique aussi pourquoi ma carte personnalisée marqueurs regardé terrible (ils étaient agrandies, puis revus à la baisse).setImageBitmap
pour définir une image. Que faire dans ce cas?drawable
. Je le déplacer àdrawable-hdpi
et il fonctionne. Merci!J'ai réduit l'image de cette façon:
ctx
signifie?Au lieu de passer des heures et des heures à essayer d'écrire/debug tout cela sous-échantillonnage de code manuellement, pourquoi ne pas utiliser
Picasso
? Il a été fait pour traiter avecbitmaps
de tous les types et/ou des tailles.J'ai utilisé cette ligne de code pour supprimer mon "image trop grande...." problème:
centerCrop()
n'est pas la seule option; pour mes besoins,.fit().centerInside()
résolu le problème sans fausser le résultat final.La modification de l'image du fichier à
drawable-nodpi
dossier dedrawable
dossier a fonctionné pour moi.drawable
dossier.Plus de 2 attributs (
AndroidManifest.xml
) a fonctionné pour moi:J'ai utilisé Picasso et avait le même problème. l'image était trop grand, au moins sur la taille, la largeur ou la hauteur. j'ai enfin trouvé la solution ici. vous pouvez mettre à l'échelle l'image de grande taille, en fonction de la taille de l'affichage et aussi garder le ratio d'aspect:
et l'utilisation de cette méthode pour le chargement de l'image de Picasso:
aussi pour de meilleures performances, vous pouvez télécharger l'image en fonction de la largeur et de la hauteur de l'écran, et non l'ensemble de l'image:
et puis:
EDIT: getDisplaySize()
display.getWidth()/getHeight()
est obsolète. Au lieu deDisplay
utilisationDisplayMetrics
.BitmapRegionDecoder
fait le tour.Vous pouvez remplacer
onDraw(Canvas canvas)
, démarrer un nouveau Thread et de décoder la zone visible à l'utilisateur.Comme indiqué par Larcho, à partir de l'API de niveau 10, vous pouvez utiliser
BitmapRegionDecoder
à la charge des régions spécifiques à partir d'une image et avec cela, vous pouvez accomplir pour afficher une grande image en haute résolution par l'allocation en mémoire juste le nécessaire régions. J'ai récemment développé une lib qui offre la visualisation d'images en grand avec touch geste de la manipulation. Le code source et des échantillons sont disponibles ici.J'ai couru à travers le même problème, voici ma solution. définir la largeur de l'image même qu'android largeur de l'écran, puis échelles de la hauteur
Ce qui est mieux pour toute taille d'écran android. laissez-moi savoir si cela fonctionne pour vous.
Au niveau de la vue
Vous pouvez désactiver l'accélération matérielle pour un individu de vue au moment de l'exécution avec le code suivant:
mavue.setLayerType(point de Vue.LAYER_TYPE_SOFTWARE, null);
Vers le bas l'échelle de l'image:
L'image sera réduite à la taille de reqHeight et reqWidth. Comme je comprends inSampleSize seulement prendre une puissance de 2 les valeurs.
J'ai essayé toutes les solutions ci-dessus, l'un après l'autre, pour de très nombreuses heures, et aucun ne semble fonctionner! Finalement, j'ai décidé de regarder autour pour un fonctionnaire exemple en ce qui concerne la capture des images avec Android appareil photo, et de les afficher. L'officiel de l'exemple (ici), enfin m'a donné la seule méthode qui a fonctionné. Ci-dessous je vous présente la solution que j'ai trouvé dans cet exemple d'application:
Utiliser Glide bibliothèque au lieu de directement de le charger dans imageview
Glisse : https://github.com/bumptech/glide
NOTE POUR CEUX QUI VEULENT METTRE DES IMAGES DE PETITE TAILLE:
Pilot_51 la solution de (déplacement à vos images
drawable-nodpi
dossier) fonctionne, mais a un autre problème:Il fait des images TROP PETITE sur l'écran, sauf si les images sont redimensionnées à une très large (comme 2000 x 3800) résolution pour adapter à l'écran -- puis, il rend votre application plus lourd.
SOLUTION: mettez vos fichiers image dans
drawable-hdpi
-- Il a travaillé comme un charme pour moi.En utilisant la bonne drawable sous-dossier résolu pour moi. Ma solution a été de mettre mon image en pleine résolution (1920 x 1200) dans le drawable-xhdpi dossier, au lieu de la drawable dossier.
J'ai aussi mis un mis à l'échelle vers le bas de l'image (1280x800) dans le drawable-hdpi dossier.
Ces deux résolutions correspond à la de 2013 et de 2012, la Nexus 7 comprimés je suis de programmation. J'ai aussi testé la solution sur d'autres tablettes.
Ce code est un travail