FRDX File Redux

CryoPNG, le beta test

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 Mac OS X

Liste des comportements incongrus connus :

- PNGOUT doit obligatoirement être installé (de préférence dans /usr/bin/), mais CryoPNG ne teste ni sa présence ni sa version (celle de février 2013 est vivement conseillée), l’auteur de PNGOUT n’autorise pas sa redistribution (sinon il serait naturellement intégré, j’ai toutefois fait une demande dans ce sens mais il trouve que CryoPNG est trop jeune pour l’instant).
Pour télécharger directement PNGOUT pour Mac OS X c’est ici que ça se passe.

- la (re)compression peut être particulièrement longue, cela devient franchement visible une fois que l’on dépasse le niveau d’optimisation 4 sur des fichiers de plus de 200 kilo octets avec une couche alpha, donc si vous n’avez pas un iMac à base de Core i5/i7 ou un Mac Pro avec 8 cœurs ou plus allez-y doucement...

- les niveaux d’optimisations ne sont pas détaillés, le niveau 4 par défaut n’utilise pas cryopng, il faut passer au 5 ou au 6 pour avoir des résultats sensiblement meilleurs avec les PNG-32 (RVB avec transparence sous forme de couche αlpha).

- l’appli utilise systématiquement tous les cœurs CPU disponibles, ce qui n’est pas toujours souhaitable.

- le fait de devoir cliquer sur Terminer à la fin avant de pouvoir déposer de nouveaux fichiers.

- le fait d’annuler une optimisation en cours ne récupère pas un éventuel fichier plus petit déjà produit.

- pour les niveaux d’optimisation 5 et 6 l’indicateur d’avancement est fantaisiste.

- il n’y a pas encore d’aide.

- la localisation en français est incomplète.

- la confusion certaine qu’il peut y avoir entre cryopng (outil shell pour Mac, Linux et Windows) et CryoPNG application avec interface graphique pour Mac OS X qui utilise cryopng.

Vous l’aurez donc compris c’est une version beta, fonctionnelle, mais une beta, n’hésitez pas à me faire part de vos remarques.
J’espère avoir un peu de temps pour faire évoluer CryoPNG prochainement.


Comment ça marche ?

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.

6 Chameleons côte à côte
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.


Peut-on faire mieux ?

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)