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 :
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 !