Après avoir bricolé des scripts bash (les cryogen...) je me suis lancé dans l’écriture d’une véritable application nommée CryoPNG pour Mac OS X (10.5 et plus, Intel et PowerPC). Ceci afin de rendre différents outils d’optimisation destinés aux images PNG plus accessibles. CryoPNG est semblable à PunyPNG ou ImageOptim mais en plus costaud, cf. Comment ça marche ?
CryoPNG est une simple interface graphique pour de puissants scripts qui eux utilisent pngout, cryopng, huffmix, defluff...
Il est désormais possible de tester CryoPNG 0.74a sur une copie de vos fichiers (en cas de problème on devrait toutefois retrouver les originaux dans la Corbeille renommés en .old).
Si CryoPNG semble ne rien faire lors de la première utilisation (les fichiers d’exemple ont la même taille une fois optimisés), c’est qu’il ne trouve pas PNGOUT, il faut valider le champ du chemin vers celui-ci en appuyant sur entrée dans les préférences.
Merci de me faire parvenir vos commentaires à : cryopng (arobase) free (point) fr.
Les nouvelles versions seront signalées sur mon compte Twitter.
CryoPNG utilise plusieurs outils (ou plusieurs fois le même mais avec des paramètres différents) à la fois en série et en parallèle pour obtenir les plus petits fichiers possible.
Plus le niveau d’optimisation choisi est élevé et plus nombreux seront les appels à PNGOUT, dans certains cas les meilleurs morceaux des différents fichiers produits par PNGOUT sont recombinés dans un nouveau fichier.
Dans une image PNG-32 les pixels sont enregistrés sous la forme de quatre composants (rouge, vert, bleu et αlpha). Si le composant αlpha (celui déterminant le niveau de transparence) vaut zéro le pixel est totalement transparent et donc invisible. Dans ce cas précis les autres composants rvb du pixel ne servent à rien et pourraient avoir n’importe quelle valeur, pour faciliter la compression ils sont souvent mis à zéro, ce qui se traduit visuellement par du noir mais invisible. Il est toutefois possible d’améliorer cette technique car chaque ligne d’une image PNG subit une transformation (souvent appelée filtre) dans le but de réduire l’entropie (la diversité et l’ampleur) des données qui s’y trouve. En général plus il y a de valeurs nulles ou petites en sortie du filtre et plus il contribue à l’amélioration de la compression. Partant de ce principe cryopng modifie les composants rvb des pixels invisibles pour qu’ils soient nuls une fois le filtrage effectué, le résultat est parfois assez esthétique comme on peut le constater sur l’exemple ci-dessous.
Il y a 5 filtres distincts, ils sont présentés ici en les appliquant à l’image entière mais chaque ligne d’une image peut disposer d’un filtre différent.
Au niveau vitesse de traitement, il y a malheureusement peu d’espoir d’aller bien plus vite car PNGOUT est notoirement connu pour être lent. Quelques niveaux d’optimisations supplémentaires seront introduits prochainement, dont un situé entre les niveaux 4 et 5 actuels, les autres seront encore plus élevés et donc plus lents. CryoPNG utilise toutes les ressources CPU disponibles autant que possible et fonctionne donc plus vite sur un Mac Pro ou un iMac haut de gamme que sur un Mac Mini ou un Mac Book Air.
Au niveau optimisation de la taille des fichiers, il y a encore quelques pistes intéressantes à explorer :
- le mode aléatoire de PNGOUT n’est pas encore exploité car la taille des fichiers produits varirait de quelques octets d’une fois sur l’autre (ce qui peut être troublant en phase de test, mais le niveau d’optimisation 8 va bientôt arriver)
- adapter cryopng aux images en niveau de gris avec couche αlpha (promis depuis plus d’un an mais je ne l’oublie pas)
- pngwolf propose deux heuristiques alternatives ainsi que son algorithme génétique pour trouver les meilleurs filtres à appliquer, pour l’instant rien de tout ceci n’est utilisé
- inclure cryopng dans pngwolf et accélérer pngwolf
- utiliser zopfli
- utiliser cryopngtk2 et tk3
- améliorer defluff pour qu’il arrive systématiquement au niveau de deflopt (ce qui veut dire écrire intégralement un programme similaire en l’absence du code source)