Recompressez vos PNG

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

28 mars 2007, 22:52

En lisant l'autre jour l'article de Wikipedia sur le PNG je suis tombé sur une page intéressante nommée "A guide to PNG optimization". L'article en question propose de réduire la taille de vos images PNG sans en altérer aucunement l'apparence. Par curiosité j'ai testé les programmes cités, et il s'est avéré qu'ils marchaient plutôt bien.

Si vous ne connaissez pas le mode de fonctionnement du PNG le voici en quelques mots. (vous pouvez aussi passer ce paragraphe si vous vous en fichez) Ça marche en deux étape : la première transforme l'image en 2 dimensions en une série d'octets (1 dimension donc) grâce à un ou plusieurs des 5 filtres possibles. Ensuite, ces données sont bêtement gzippées. Ça parait simple comme ça, mais sachant qu'il y a plusieurs modes de couleurs ou de transparences possibles (palette de 0 à 256 couleurs, 16 millions de couleurs, 256 tons de gris, transparence simple ou alpha) et qu'il y a plusieurs niveaux de compression zlib et quelques autres nuances, on se retrouve avec des centaines, voire des milliers de combinaisons possibles. Et j'allais oublier de parler des filtres. En gros, si vous voulez transformer une image en 2D en flux à 1D, vous pouvez commencer en haut à gauche, aller tout à droite, descendre d'une ligne et recommencer. Si votre image est composée d'un dégradé ou de rayures horizontales ça se compresse très bien car c'est très redondant: "noir noir noir noir noir noir noir noir<nouvelle ligne>blanc blanc blanc blanc blanc<etc...>" mais si vous avez des rayures verticales alors c'est moins bien "blanc, noir, blanc, noir, etc...". Dans ce cas vous pouvez parcourir les pixels de haut en bas et de gauche à droite plutôt. Etc, etc... Lisez l'article de Wikipedia ;)

Donc je disais, ça marche. Et comme j'aime bien économiser gratuitement de la bande passante j'ai mis au point un petit script Batch qui teste à peu près toute les combinaisons grâce à ces excellents programmes (qui ont tous leur point fort et leur point faible). La recompression prendre quelques secondes pour une icones ou un bouton et une minute ou deux pour une bannière ou une petite capture d'écran. Un fichier de backup ".bak" est automatiquement créé. Sachez aussi que toute information supplémentaire (qui n'est pas vitale) est retirée. Ça inclut le nom du logiciel de retouche que vous avez utilisé, l'heure associée à l'image (qui de toute façon est stockée dans le système de fichier) ou la gamma associée à l'image.

Comment l'installer ?
Créez un dossier "OptiPNG" dans votre répertoire "Program Files". Téléchargez les programmes pngcrush, OptiPNG, AdvanceCOMP et PNGOut, puis décompressez-les dans ce nouveau dossier.

Sauvegardez ce script sous le nom "png.bat" (ou ce que vous voulez en fait)

Code : Tout sélectionner

@echo off copy %1 %1.bak.2 @echo on "C:\Program Files\OptiPNG\pngout.exe" /y /ktRNS /f0 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /ktRNS /f1 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /ktRNS /f2 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /ktRNS /f3 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /ktRNS /f4 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /ktRNS /f5 %1 %1 "C:\Program Files\OptiPNG\advpng.exe" -z -4 %1 "C:\Program Files\OptiPNG\pngcrush.exe" -brute -l 9 -zmem 9 -reduce -nofilecheck %1 %1.tmp @echo off del %1 rename %1.tmp %1 del %1.bak @echo on "C:\Program Files\OptiPNG\optipng.exe" -zc1-9 -zm1-9 -zs0-3 -f0-5 %1 "C:\Program Files\OptiPNG\advpng.exe" -z -4 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /d0 /ktRNS /f0 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /d0 /ktRNS /f1 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /d0 /ktRNS /f2 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /d0 /ktRNS /f3 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /d0 /ktRNS /f4 %1 %1 "C:\Program Files\OptiPNG\pngout.exe" /y /d0 /ktRNS /f5 %1 %1 @echo off rename %1.bak.2 %1.bak @echo on
Comment l'utiliser ?
Ouvrez une fenêtre DOS (Windows+R puis "cmd"), allez dans le dossier de l'image à recompressez et exécutez

Code : Tout sélectionner

"C:\Program Files\OptiPNG\png.bat" icone.png
...où "icone.png" est évidemment le nom du fichier à recompresser.

Ça peut sembler beaucoup de tracas pour pas grand-chose, mais j'aime bien l'idée d'économiser de la bande passante gratuitement (à part quelques secondes de CPU). En vous souhaitant bon usage :)
Modifié en dernier par Hubert Roksor le 29 mars 2007, 06:43, modifié 2 fois.

ViPHP
ViPHP | 3607 Messages

28 mars 2007, 23:13

ça à l'air très interessant!!
Mais je m'imagine mal..., as-tu un ordre d'idée du poid gagné (je sais bien que ça va dépendre du soft qui à créer le png, si c'est un 8 bit ou un 24, etc etc) mais le gain se compte en pourcents, ou c'est en dessous ?
J'essayerai sous peu ;-)

ps:juste une petite erreur de bbcode dans ta rédaction

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

29 mars 2007, 06:42

Ça dépend beaucoup du type d'image et du logiciel. Pour MSPaint c'est aux alentours de 40-50% :lol: Sinon je dirais entre 10 et 25%. Un conseil, sauvegarde les images en 24bits (16 millions de couleurs) car ça se compresse parfois mieux qu'une palette réduite. Si l'image comporte 256 couleurs ou moins, elle est transformée en palette en milieu de script (si ça fait gagner en compression uniquement).

PS: corrigé ;)

ViPHP
ViPHP | 4674 Messages

04 nov. 2007, 19:42

Hey :)

Je ressors ton message suite à ton intervention.
J'ai une question. Apparemment seul PNGOut est porté sur Mac. Les autres non. Y a-t-il un réel intérêt à le faire (maintenant que le temps est passé, tu as pu — sans doute — t'en apercevoir) ? Comparé à une compression faite avec Photoshop ou Gimp, on voit une différence flagrante ?

Merci pour ces précisions :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 2287 Messages

04 nov. 2007, 20:41

Je me permets de rajouter un logiciel à la liste : http://psydk.org/PngOptimizer.php

Petit, simple, pratique et fait par un français ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 493 Messages

08 nov. 2007, 13:02

Actuellement, la meilleure solution que j'ai trouvé se trouve sur le site CSS-IG.net. Il s'agit d'un script BAT dans la même lignée que celui d'Hubert Roksor. Le site comporte aussi des articles sur PNG afin de mieux comprendre le fonctionnement de ce format. Stoo !

ViPHP
ViPHP | 2287 Messages

08 nov. 2007, 22:46

Actuellement, la meilleure solution que j'ai trouvé se trouve sur le site CSS-IG.net.
Je remarque que ce script qui a l'air très bien utilise la version en ligne de commande de pngoptimizer, le programme que je recommandais juste au-dessus. Le monde est petit parfois :D
if(!@work()){ Nespresso(); } else { what(); }
______________________________