WEB-d Développement Web

PHP, SQL, HTML5, CSS3, Javascript, Mootools, Référencement, SEO, CMS, e-commerce, Apache, Linux, Ubuntu, ...

Optimisation des images : smush.it en ligne de commande

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.

Smush.it

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);
}
?>
 

Articles similaires