Comment compresser ses images en ligne de commande ?

compression-image

Ajourd’hui on va parler un peu de performance. Je ne sais pas si vous le savez, mais plus votre site sera léger (taille des images, taille du css, taille des js etc), plus il sera rapidement afficher chez votre client (logique ?!). Donc le client ou le visiteur sera content, et au passage google aussi (google aime quand ca va vite) et donc au final, c’est vous qui serez content ;) .

J’ai donc fait un petit script bash qui s’exécute sous linux, en ligne de commande. Ce script sert a redimensionner les images de type png, en enlevant les meta-données qui sont inutiles sur le web (je ne parle pas de photos, mais bien d’images, comme les images du css, les boutons etc …). Je vous préviens tout de suite, ce script n’est pas parfait, il peut bien sur être améliorer. D’ailleurs j’accepte toutes les suggestions étant donnée que je ne suis vraiment pas un pro de la ligne de commande !

Pour exécuter ce script vous aurez besoin de 2 logiciel : optipng et pngcrush. On peut aussi a travers ce script convertir les jpeg en png mais les images sont plus lourdes qu’au départ … :S Pour cette conversion on aura besoin de imagemagick. Donc pour installer ces logiciels il suffit de faire :

sudo apt-get install optipng pngcrush imagemagick

Voila, maintenant il faut télécharger le script et le rendre exécutable :

wget http://blog.lyrixx.info/wp-content/uploads/2009/10/compresspng.sh.txt
mv compresspng.sh.txt compresspng.sh
chmod +x compresspng.sh

ce script prend deux arguments : le premier est le path du dossier ou sont toutes vos images. Le script scan le dossier en récurrence (dossiers et sous dossiers). Le deuxième arguments sert a définir le niveau de compression :

  • 0 => ne fait rien, liste seulement les images png
  • 1 => compresse avec optipng
  • 2 => compresse avec pngcrush
  • 3 => compresse avec optipng et pngcrush
  • 4 => converti tous les jpeg en png (attention, la taille grossit tres vite)

Je vous préviens tout de suite que l’exécution du script peut etre exéssivement long, et demande un forte charge CPU.
Il ne reste plus qu’a executer le script :

./compresspng.sh /home/image/ 3

Le script :

#!/bin/bash
## Pineau Grégoire pour http://blog.lyrixx.info
## Utilisation :
## ./compresspng PATH LEVEL
## PATH est le dossier racine des images a compresser
## LEVEL est le niveau de compression :
##		0 => ne fait rien, liste seulement les images png
##		1 => compresse avec optipng
##		2 => compresse avec pngcrush
##		3 => compresse avec optipng et pngcrush
##		4 => converti tous les jpeg en png (attention, la taille grossit tres vite)
## A installer : imagemagick pngcrush optipng

Docompress(){
	if [ $2 = 0 ]
	then
		Dolist $1
	elif [ $2 = 2 ]
	then
		Dooptipng $1
	elif [ $2 = 2 ]
	then
		Dopngcrush $1
	elif [ $2 = 3 ]
	then
		Dooptipng $1
		Dopngcrush $1
	fi
}
Dolist(){
	echo $1
}
Dooptipng(){
	optipng -o7 $1
}

Dopngcrush(){
	pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB $1 tmp_img_file.png;
    mv -f tmp_img_file.png $1;
}

Doconvertjpgpng(){
	convert -strip  $1 $1.png
}

#On vérifie le nombre d'argument
if [ $# != 2 ]
then
	echo "Il n'y a pas assez d'arguments, il faut deux arguments"
	echo "Le premier est le path du dossier a traiter"
	echo "Le deuxieme est le niveau de compression : "
	echo "	0 => ne fait rien, liste seulement les images"
	echo "	1 => compresse avec optipng"
	echo "	2 => compresse avec pngcrush"
	echo "	3 => compresse avec optipng et pngcrush"
	echo "	4 => convertir les jpeg en png (attention, la taille grossit tres vite)"
	exit
fi

if [ $2 = 4 ]
then
	# On boucle (avec reccurence) sur tous les fichiers jpg de notre dossier
	for file in `find $1 -iname '*.jpg' -print 2>/dev/null`
	do
		Doconvertjpgpng $file;
	done
	# On boucle (avec reccurence) sur tous les fichiers jpeg de notre dossier
	for file in `find $1 -iname '*.jpg' -print 2>/dev/null`
	do
		Doconvertjpgpng $file;
	done
else
	# On boucle (avec reccurence) sur tous les fichiers png de notre dossier
	for file in `find $1 -iname '*.png' -print 2>/dev/null`
	do
		Docompress $file $2;
	done
fi

Ps : Je pense que ce script va faire plaisir a Eric daspet ;)

Articles en rapport :


Et on peut meme partager l'article:

  • Print
  • Twitter
  • Facebook
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Netvibes
  • Blogosphere News
  • Identi.ca
  • LinkedIn
  • Technorati
  • Wikio FR
  • Yahoo! Buzz
  • Ping.fm

4 Commentaires

gtraxxmars 22nd, 2010 at 10 h 43 min

Bonjour comment supprimer l’utilisation de la conversion jpg=>png, je suppose qu’il faut enlever quelques ligne dans le script ?
Merci d’avance

Gregmars 22nd, 2010 at 11 h 47 min

si tu ne veux pas l’utiliser, tu utilises le script avec l’option 3 !
sinon tu supprimes :

11 ## 4 => converti tous les jpeg en png (attention, la taille grossit tres vite)

42 Doconvertjpgpng(){
43 convert -strip $1 $1.png
44 }

et tu remplace :
60 if [ $2 = 4 ]
61 then
62 # On boucle (avec reccurence) sur tous les fichiers jpg de notre dossier
63 for file in `find $1 -iname ‘*.jpg’ -print 2>/dev/null`
64 do
65 Doconvertjpgpng $file;
66 done
67 # On boucle (avec reccurence) sur tous les fichiers jpeg de notre dossier
68 for file in `find $1 -iname ‘*.jpg’ -print 2>/dev/null`
69 do
70 Doconvertjpgpng $file;
71 done
72 else
73 # On boucle (avec reccurence) sur tous les fichiers png de notre dossier
74 for file in `find $1 -iname ‘*.png’ -print 2>/dev/null`
75 do
76 Docompress $file $2;
77 done
78 fi

Par
73 # On boucle (avec reccurence) sur tous les fichiers png de notre dossier
74 for file in `find $1 -iname ‘*.png’ -print 2>/dev/null`
75 do
76 Docompress $file $2;
77 done

Voila, je pense que ca doit etre bon !

gtraxxjuillet 1st, 2010 at 11 h 34 min

Peut on lancer le script avec php ?
je pense que c’est possible avec exec, je souhaite par exemple télécharger l’image sur le serveur via un formulaire et faire l’exécution à ce moment précis sur l’image télécharger
J’ai regarder du côté du script de punypng mais c’est du ruby :( et puis aucune doc

Gregjuillet 19th, 2010 at 17 h 00 min

Oui normalement tu peux le faire avec la fonction exec.

Laisser un commentaire

Votre commentaire :

Additional comments powered by BackType