Je charge un bitmap dans un ImageView et vois cette erreur. Je suppose que cette limite concerne une limite de taille pour les textures matérielles OpenGL (2048x2048). L'image que je dois charger est une image à zoom par pincement d'environ 4 000 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 un ImageView?
inSampleSize
approche.Réponses:
Tout le rendu est basé sur OpenGL, donc non, vous ne pouvez pas dépasser cette limite (
GL_MAX_TEXTURE_SIZE
dépend de l'appareil, mais le minimum est de 2048x2048, donc toute image inférieure à 2048x2048 conviendra).Avec des images aussi grandes, si vous souhaitez effectuer un zoom arrière, et dans un mobile, vous devez configurer un système similaire à ce que vous voyez dans google maps par exemple. Avec l'image divisée en plusieurs morceaux et plusieurs définitions.
Ou vous pouvez réduire l'image avant de l'afficher (voir la réponse de user1352407 à cette question).
Et aussi, faites attention dans le dossier dans lequel vous mettez l'image, Android peut automatiquement agrandir les images. Jetez un œil à la réponse de Pilot_51 ci-dessous à cette question.
la source
Ce n'est pas une réponse directe à la question (chargement d'images> 2048), mais une solution possible pour toute personne rencontrant l'erreur.
Dans mon cas, l'image était plus petite que 2048 dans les deux dimensions (1280x727 pour être exact) et le problème a été spécifiquement rencontré sur un Galaxy Nexus. L'image était dans le
drawable
dossier et aucun des dossiers qualifiés. Android suppose que les dessinables sans qualificatif de densité sont mdpi et les met à l'échelle vers le haut ou vers le bas pour d'autres densités, dans ce cas mis à l'échelle 2x pour xhdpi. Le déplacement de l'image coupable versdrawable-nodpi
pour éviter la mise à l'échelle a résolu le problème.la source
drawable
essentiellement undrawable-mdpi
dossier caché . Cela expliquait également pourquoi mes marqueurs de carte personnalisés semblaient horribles (ils étaient en cours de mise à l'échelle, puis de réduction).J'ai réduit l'image de cette manière:
la source
ctx
signifie?Au lieu de passer des heures et des heures à essayer d'écrire / déboguer manuellement tout ce code de sous-échantillonnage, pourquoi ne pas l'utiliser
Picasso
? Il a été conçu pour traiterbitmaps
de tous types et / ou tailles.J'ai utilisé cette seule ligne de code pour supprimer mon problème "bitmap trop grand ..." :
la source
L'ajout des 2 attributs suivants dans (
AndroidManifest.xml
) a fonctionné pour moi:la source
Changer le fichier image en dossier à
drawable-nodpi
partir dudrawable
dossier a fonctionné pour moi.la source
drawable
dossier.J'ai utilisé Picasso et j'ai eu le même problème. l'image était trop grande au moins en taille, largeur ou hauteur. enfin j'ai trouvé la solution ici. vous pouvez redimensionner la grande image en fonction de la taille d'affichage et également conserver le rapport hauteur / largeur:
et utilisez cette méthode pour charger l'image par Picasso:
également pour de meilleures performances, vous pouvez télécharger l'image en fonction de la largeur et de la hauteur de l'écran d'affichage, pas de l'image entière:
puis:
MODIFIER: getDisplaySize ()
display.getWidth()/getHeight()
est obsolète. Au lieu de l'Display
utiliserDisplayMetrics
.la source
BitmapRegionDecoder
fait l'affaire.Vous pouvez remplacer
onDraw(Canvas canvas)
, démarrer un nouveau fil et décoder la zone visible par l'utilisateur.la source
Comme l'a souligné Larcho, à partir du niveau d'API 10, vous pouvez utiliser
BitmapRegionDecoder
pour charger des régions spécifiques à partir d'une image et avec cela, vous pouvez accomplir pour afficher une grande image en haute résolution en allouant en mémoire uniquement les régions nécessaires. J'ai récemment développé une bibliothèque qui permet de visualiser de grandes images avec la gestion des gestes tactiles. Le code source et des exemples sont disponibles ici .la source
Afficher le niveau
Vous pouvez désactiver l'accélération matérielle pour une vue individuelle au moment de l'exécution avec le code suivant:
myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);
la source
J'ai rencontré le même problème, voici ma solution. définir la largeur de l'image comme la largeur de l'écran Android, puis redimensionner la hauteur
C'est mieux pour n'importe quel écran Android de taille. Dites-moi si cela marche pour vous.
la source
Réduire l'image:
L'image sera réduite à la taille de reqHeight et reqWidth. Comme je le comprends, inSampleSize ne prend qu'une puissance de 2 valeurs.
la source
Utilisez la bibliothèque Glide au lieu de charger directement dans imageview
Glide: https://github.com/bumptech/glide
la source
J'ai essayé toutes les solutions ci-dessus, l'une après l'autre, pendant de nombreuses heures, et aucune ne semblait fonctionner! Enfin, j'ai décidé de chercher un exemple officiel concernant la capture d'images avec l'appareil photo d'Android et leur affichage. L'exemple officiel ( ici ), m'a finalement donné la seule méthode qui a fonctionné. Ci-dessous, je présente la solution que j'ai trouvée dans cet exemple d'application:
la source
REMARQUE POUR CEUX QUI VEULENT METTRE DES IMAGES DE PETITE TAILLE:
La solution de Pilot_51 (déplacer vos images dans un
drawable-nodpi
dossier) fonctionne, mais présente un autre problème: elle rend les images TROP PETITES à l'écran à moins que les images ne soient redimensionnées à une très grande résolution (comme 2000 x 3800) pour s'adapter à l'écran - alors cela rend votre application plus lourde .SOLUTION : mettez vos fichiers image dedans
drawable-hdpi
- Cela a fonctionné comme un charme pour moi.la source
L'utilisation du sous-dossier dessinable correct a résolu le problème pour moi. Ma solution était de mettre mon image pleine résolution (1920x1200) dans le dossier drawable-xhdpi , au lieu du dossier drawable .
J'ai également mis une image réduite (1280x800) dans le dossier drawable-hdpi .
Ces deux résolutions correspondent aux tablettes Nexus 7 2013 et 2012 que je programme. J'ai également testé la solution sur d'autres tablettes.
la source
Ce code est du travail
la source