4 votes

Réduire proprement la taille des images dans Android : est-ce possible ?

J'ai du mal à réduire proprement la taille des images sur Android. Je cherche à mettre à l'échelle de petites images PNG entre des tailles arbitraires d'environ 10 à 100 % de leur taille d'origine.

J'ai créé un exemple d'image pour démontrer le problème et exacerber les comportements inhabituels que j'observe dans le convertisseur d'image d'Android :

NOTE: you will want to right-click on the image and view it directly...this page may downscale the image again L'image ci-dessus est une capture d'écran d'un appareil Android avec quelques annotations ajoutées. J'ai également ajouté les mêmes images dans une deuxième colonne sur le côté gauche montrant comment elles sont rendues avec une mise à l'échelle linéaire par "The GIMP" (GNU Image Manipulation Program).

L'image de base consiste en un fond en damier de pixels rouges et bleus. Sur ce fond, j'ai dessiné des lignes jaunes de 1 px de large et un texte vert assez fin. L'image mesure 288x288 pixels.

Lorsqu'on réduit l'image à un tiers de ses dimensions d'origine, Android semble simplement saisir un pixel sur neuf, en rejetant toutes les autres données. Certaines des lignes jaunes disparaissent ainsi complètement. Remarquablement, le motif en damier reste intact (ce qui est simplement le résultat de l'utilisation d'un pixel sur trois).

Lors de la mise à l'échelle de l'image à une dimension proche, mais pas exactement, de 50 % de sa taille originale, par exemple 142x142 ou 143x143, le dispositif de mise à l'échelle crée des anomalies/artifacts assez importants sur l'image.

À la taille de 50 % (144x144), l'image semble correcte.

L'image de test fait ressortir le pire du redimensionneur d'images, mais les images d'icônes PNG "normales" sont également gravement touchées. De 10 à 33 % environ, les images ne sont pas rééchantillonnées correctement et apparaissent donc extrêmement "bitmap". Et certaines images de plus grande taille présentent des anomalies très étranges à certaines tailles.

Si quelqu'un connaît un moyen de désactiver cet étrange comportement de mise à l'échelle, même au prix d'une baisse des performances, j'apprécierais grandement de le savoir. Cela peut certainement être résolu en écrivant un algorithme qui travaille directement sur les pixels des bitmaps, mais j'espère que ce n'est pas la seule option.

Il convient également de noter que tous les travaux sur les images sont effectués avec des Bitmap.Configs ARGB_8888. J'ai essayé de manipuler la taille de l'image en définissant maxwidth/maxheight sur les ImageViews, en utilisant Bitmap.createScaledBitmap(), et en utilisant Bitmap.createBitmap avec une matrice. Toutes les tentatives ont le même résultat. Le filtrage des bitmaps est activé.

Merci encore pour toutes les suggestions !

2voto

ElementW Points 610

L'utilisation de Bitmap.createScaledBitmap() et Bitmap.createBitmap avec une matrice est la même ; voir la source de Bitmap.createScaledBitmap (qui n'a pas changé depuis Android 2).

Sur Android 4.0+, l'utilisation d'une matrice (comme dans Bitmap.createScaledBitmap) permet des opérations accélérées par le matériel si elles sont activées (activées par défaut sur 4.1+ IIRC), donc nous n'avons pas de contrôle direct sur ce qui est fait et comment cela est fait.

Cela signifie que vous devrez mettre en œuvre votre propre méthode de mise à l'échelle en utilisant le filtrage souhaité (ici, linéaire) ; soit par traitement des pixels ; soit en utilisant OpenGL ES avec le bon filtre, mais il se peut qu'il ne soit pas disponible sur tous les appareils.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X