Optimisation fichiers PNG

Vos petites astuces, répertoire des tutoriels et astuces
Répondre
Avatar du membre
tioker
modérateur
Messages : 982
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Optimisation fichiers PNG

Message par tioker »

Bonjour,
Ceci n'est pas une question mais une astuce.
Je suis (comme beaucoup) adepte des bibliothèques de procédures associées à l'explorateur de fichier - Nemo dans mon cas (mais ça s'applique aussi à bien d'autres je crois).
Je me suis bien amusé à générer des Comics sur ce site. Mais le résultat ne me semblait pas optimisé dans le sens où les fichiers générés avaient un certain ... embonpoint; mes correspondants à qui j'avais envoyé le résultat me l'ont fait remarquer :oops: ...
J'ai ressorti une procédure que j'ai adaptée pour optimiser les PNG, je vous la soumets.
En deux mots, dans le répertoire /home/chezmoi/.local/share/nemo/scripts/Images, je mets le fichier shell du nom que je veux (pngnq.sh pour ma part) qui me permet, d'un clic droit, d'appliquer la procédure à un ou plusieurs fichiers. Et là miracle, j'ai dans mon exemple un gain de place de 75% ! (attention, ici c'est le maximum)
pré-requis installer le programme

Code : Tout sélectionner

sudo apt install pngnq
Vous pouvez adapter le code, surtout si vous ne voulez pas conserver les anciennes versions (.old). Et je suis ouvert aux améliorations bien sûr.
Merci de vos retours.

Code : Tout sélectionner

#!/bin/bash
# ----------------------Optimise les fichiers png
#-----P = Prefix du nom de fichier
#-----N = Nouveau nom temporaire
#-----E = extension des fichiers
#!
for x in "$@"
do
	E=${x##*.}						# on récupère l'extension (source: https://math-linux.com/linux-2/bash/article/comment-extraire-le-nom-et-l-extension-d-un-fichier-en-bash)
	E=${E,,}						# on la met en minuscule (source: https://www.supinfo.com/articles/single/4814-manipulation-chaine-caracteres-bash)
	if [ $E = "png" ]				# si c'est du png...
	then
		P=${x%%.*}					# Préfixe dui fichier
		pngnq -fe ".png2" "$x"		# Optimisation du png, sortie en extesion .png2
		O="$x.old"					# Constitution n om fichier sauvegarde
		N="$P.png2"					# nom du fichier généré
		mv $x $O					# Sauvegarde ancienne version
		mv $N $x					# mise en ligne nouvelle version fichier
	fi
done
Voici un résultat optimisé !

Image
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
cyrille
Administrateur du site
Messages : 12399
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Optimisation fichiers PNG

Message par cyrille »

Hello

Intéressant mais quelle(s) différence(s) avec simplement

Code : Tout sélectionner

pngnq *.png
(si on ne garde pas de backup)

Et aussi as tu testé les performances de pnpng par rapport à optipng ?

J'ai fait quelques tests

Échantillons de 68 png (des captures d'écran aléatoires) pour un espace disque de 5,8 Mo

Code : Tout sélectionner

$ du -sh
5,8M	.
$ ls | wc -l
68

Test sur les commandes suivantes
Pour pngnq

Code : Tout sélectionner

pngnq -s1 -vf *.png

Code : Tout sélectionner

real	1m4,577s
user	1m4,543s
sys	0m0,026s

du -sh
8,0M	
.



Pour optipng

Code : Tout sélectionner

optipng -o7 *.png

real	5m54,766s
user	5m53,341s
sys	0m1,404s

du -sh
3,7M	
.



Marrant, avec pngnq, je finis avec un dossier plus gros que celui de base !
Par contre optipng fait bien le boulot mais on voit qu'il prend son temps



Si je le fais avec la valeur par defaut (3)

Code : Tout sélectionner

pngnq -s3 -vf *.png

real	0m24,948s
user	0m24,915s
sys	0m0,029s

$ du -sh
8,0M

Faudrait voir ce que retourne

Code : Tout sélectionner

pngcrush
Modifié en dernier par cyrille le mer. 1 avr. 2020 16:19, modifié 1 fois.
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12399
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Optimisation fichiers PNG

Message par cyrille »

Et aussi pour ta boucle de backup, pourquoi ne pas opter pour une solution plus simple , style :

Code : Tout sélectionner

 for filename in /You/Path/*.png ; 
     do cp $filename $filename.bak ; 
 done
et ensuite ne traiter que les fichiers avec ext png
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
tioker
modérateur
Messages : 982
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Re: Optimisation fichiers PNG

Message par tioker »

Re-bonjour

Merci pour votre contribution, je regarde et vous fais un retour (1),

Mais déjà une précision importante: à aucun moment je n'utilise le terminal, et par la sélection (clic droit dans l'explorateur fichier) je peux optimiser un, plusieurs, tous les fichiers d'un dossier.
Je crois que la commande pngnq -fe ".png" toto.png (par laquelle je voudrais écraser le fichier d'origine) me retourne l'erreur suivante

Code : Tout sélectionner

pngnq - Error in pngnq.c near line 498 :
  rwpng_read_image() error: 21
Raison pour laquelle je passe par un .png2.

(1)
J'ai installé optipng et j'ai fait le test suivant:
- un fichier png de 8Mo
- je l'optimise avec pngnq --> il passe à 1,3Mo en 1,4 sec
- je l'optimise avec optipng (sans option) --> il passe à 4,6Mo en 12,4 sec
- après avoir restauré le fichier d'origine je refait un optipng (option -o7) --> il est resté à 4,6Mo mais en 3 minutes 4 secondes !!!
Donc je suis dubitatif...

Je pense qu'on peut dire que tous les fichiers ne sont pas éligibles à l'optimisation et qu'il existe au moins deux utilitaires (pngnq et optipng) pour le faire.
Procédure à adapter suivant ses goûts.

PS: j'utilise pngnq aussi pour optimiser les images publiées sur le Web après les avoir mises à la bonne taille.

Trace de mes tests pour les curieux

Code : Tout sélectionner

patrick@lmde4:~/Téléchargements/Test$ time pngnq -f Fleurs.png

real	0m1,405s
user	0m1,396s
sys	0m0,008s
patrick@lmde4:~/Téléchargements/Test$ time optipng  Fleurs.png
** Processing: Fleurs.png
1760x2554 pixels, 4x8 bits/pixel, RGB+alpha
Reducing image to 3x8 bits/pixel, RGB
Input IDAT size = 8241578 bytes
Input file size = 8253707 bytes

Trying:
  zc = 9  zm = 8  zs = 0  f = 0		IDAT size = 7139129
  zc = 9  zm = 8  zs = 0  f = 5		IDAT size = 4738258
  zc = 9  zm = 8  zs = 1  f = 5		IDAT size = 4620155
                               
Selecting parameters:
  zc = 9  zm = 8  zs = 1  f = 5		IDAT size = 4620155

Output IDAT size = 4620155 bytes (3621423 bytes decrease)
Output file size = 4620212 bytes (3633495 bytes = 44.02% decrease)


real	0m12,384s
user	0m12,341s
sys	0m0,020s
patrick@lmde4:~/Téléchargements/Test$ # ------------- là j'ai restauré le fichier d'origine 
patrick@lmde4:~/Téléchargements/Test$ time optipng -o7 Fleurs.png
** Processing: Fleurs.png
1760x2554 pixels, 4x8 bits/pixel, RGB+alpha
Reducing image to 3x8 bits/pixel, RGB
Input IDAT size = 8241578 bytes
Input file size = 8253707 bytes

Trying:
  zc = 9  zm = 9  zs = 0  f = 0		IDAT size = 7133558
  zc = 9  zm = 9  zs = 0  f = 1		IDAT size = 5231246
  zc = 9  zm = 9  zs = 1  f = 1		IDAT size = 5128040
  zc = 9  zm = 9  zs = 0  f = 2		IDAT size = 4898986
  zc = 9  zm = 9  zs = 1  f = 2		IDAT size = 4830179
  zc = 9  zm = 9  zs = 1  f = 3		IDAT size = 4789303
  zc = 9  zm = 9  zs = 0  f = 4		IDAT size = 4735679
  zc = 9  zm = 9  zs = 1  f = 4		IDAT size = 4613530
  zc = 9  zm = 9  zs = 1  f = 5		IDAT size = 4611915
                               
Selecting parameters:
  zc = 9  zm = 9  zs = 1  f = 5		IDAT size = 4611915

Output IDAT size = 4611915 bytes (3629663 bytes decrease)
Output file size = 4611972 bytes (3641735 bytes = 44.12% decrease)


real	3m4,306s
user	3m4,226s
sys	0m0,048s
patrick@lmde4:~/Téléchargements/Test$ 
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Répondre