Optimisation des images : smush.it en ligne de commande
Posté le Thursday 19 July 2012 | Catégories : PHP, Linus, Ubuntu, Optimisation
Smush.it est un outil en ligne créé par Yahoo qui permet de réduire la taille des images sans perte de qualité. Il fonctionne en supprimant du fichier image certaines données inutiles (comme les données exif par exemple), ou en cherchant un meilleur algorithme de compression. Certains scripts disponibles sur Internet permettent d'utiliser Smush.it depuis la ligne de commande. Comme toutes les images doivent être uploadées vers le serveur Smush.it, ils sont plutôt lents.
La documentation de Yahoo indique que Smush.it utilise en fait 2 outils libres disponibles dans n'importe quelle distribution Linux : pngcrush et jpegtran
PNG
Pour installer pngcrush sur Ubuntu, il suffit de :
sudo apt-get install pngcrush
On peut ensuite réduire une image PNG avec la commande suivante :
pngcrush -rem alla -reduce -brute -l 9 image.png image_reduite.png
JPEG
Sur Ubuntu, le programme jpegtran fait partie du paquet libjpeg-progs :
sudo apt-get install libjpeg-progs
Pour réduire une photo JPEG :
jpegtran -copy none -optimize -perfect -outfile image_reduite.jpg image.jpg
Optimiser toutes les images automatiquement
Le script ci-dessous utilise pngcrush et jpegtran pour optimiser automatiquement toutes les images d'un répertoire (et de ses sous-répertoires).
Le script utilise également Image Magick pour comprimer les images JPEG. Cette compression est une compression classique avec perte, mais reste imperceptible à l'oeil nu (niveau de qualité 83 dans Photoshop ou GIMP).
Pour l'utiliser, il suffit de lui indiquer le répertoire où se trouvent les images :
optimize-images.php /var/www/images
Si Image Magick n'est pas présent sur votre système, il faut naturellement l'installer :
sudo apt-get install imagemagick
#! /usr/bin/php
<?php
// optimize-images.php
$folder = $argv[1];
analyze($folder);
function analyze($folder) {
$folder = rtrim($folder, "/");
echo "[F] $folder\n";
$handle = opendir($folder);
if ($handle === false) {
echo "Error!";
}
while (false !== ($file = readdir($handle))) {
if ($file == "." OR $file == "..") {
continue;
}
if (strtolower(substr($file, -3)) == "png") {
pngcrush($folder . "/" . $file);
}
if (
strtolower(substr($file, -3)) == "jpg"
OR strtolower(substr($file, -4)) == "jpeg") {
jpegtran($folder . "/" . $file);
}
if (is_dir($folder . "/" . $file)) {
analyze($folder . "/" . $file);
}
}
closedir($handle);
}
function pngcrush($file) {
echo "[P] $file\n";
$file = str_replace(" ", "\ ", $file);
$file = str_replace("(", "\(", $file);
$file = str_replace(")", "\)", $file);
exec("mv $file /var/tmp/crush.png");
$command = "pngcrush -rem alla -reduce -brute -l 9 /var/tmp/crush.png $file";
exec($command);
}
function jpegtran($file) {
echo "[J] $file";
$file = str_replace(" ", "\ ", $file);
$file = str_replace("(", "\(", $file);
$file = str_replace(")", "\)", $file);
$quality = 100;
$output = array();
$command = "identify -verbose $file";
exec($command, $output);
foreach ($output as $line) {
if (substr($line, 0, 11) == " Quality: ") {
$quality = trim(substr($line, 11));
break;
}
}
echo " : $quality\n";
if ($quality > 83) {
$command = "convert $file -quality 83 $file";
exec($command);
}
$command = "jpegtran -copy none -optimize -perfect -outfile $file $file";
exec($command);
}
?>