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:

4 thoughts on “Comment compresser ses images en ligne de commande ?

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

  2. 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 !

  3. 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