web-dev-qa-db-fra.com

Optimiser les images téléchargées avec php (jpeg)

Lors de l'exécution de Page Speed ​​dans Google Chrome, il est suggéré d'optimiser/de compresser les images. Ces images sont principalement téléchargées par les utilisateurs, il faudrait donc les optimiser lors du téléchargement. Ce que je trouve sur l’optimisation d’images JPEG avec PHP est un peu comme l’utilisation des fonctions Gd suivantes:

getimagesize()
imagecreatefromjpeg()
imagejpeg()

Comme je redimensionne les images après le téléchargement, je tire déjà l’image à travers ces fonctions et j’utilise en outre imagecopyresampled() après imagecreatefromjpeg() pour la redimensionner. 

Mais alors, Page Speed ​​me dit toujours que ces images peuvent être optimisées. Comment puis-je accomplir cette optimisation dans un script php? Régler la qualité plus bas dans imagejpeg () ne fait aucune différence non plus.

13
Juvlius

La fonction imagejpeg est l'endroit où vous attribuez la qualité. Si vous définissez déjà cette valeur sur une valeur appropriée, vous ne pouvez rien faire de plus.

La vitesse de la page considère probablement toutes les images dépassant une certaine taille comme "nécessitant une compression". Assurez-vous simplement qu'elles sont toutes aussi petites que raisonnables (en termes de hauteur/largeur) et compressées.

Pour en savoir plus sur la vitesse des pages et ses suggestions de compression, consultez pagespeed docs http://code.google.com/speed/page-speed/docs/payload.html#CompressImages , qui décrit certaines techniques/outils. compresser de manière appropriée.

Je viens aussi de lire ce qui suit:

Plusieurs outils sont disponibles pour effectuer davantage, lossless compression sur les fichiers JPEG et PNG, sans effet sur la qualité d'image. Pour JPEG, nous recommandons jpegtran ou jpegoptim (disponible sous Linux uniquement; exécuté avec l'option --strip-all). Pour PNG, nous recommandons OptiPNG ouPNGOUT.

Alors peut-être (si vous voulez vraiment vous en tenir aux suggestions de Google), vous pouvez utiliser la variable exec de PHP pour exécuter l'un de ces outils sur les fichiers au fur et à mesure de leur téléchargement.


Pour compresser avec php, procédez comme suit (vous avez déjà l’impression de le faire):

$source_url est l'image, $destination_url est l'endroit où enregistrer et $quality est un nombre compris entre 1 et 100 indiquant le niveau de compression jpeg à utiliser.

function compressImage($source_url, $destination_url, $quality) {
    $info = getimagesize($source_url);

    if ($info['mime'] == 'image/jpeg') $image = imagecreatefromjpeg($source_url);
    elseif ($info['mime'] == 'image/gif') $image = imagecreatefromgif($source_url);
    elseif ($info['mime'] == 'image/png') $image = imagecreatefrompng($source_url);

    //save file
    imagejpeg($image, $destination_url, $quality);

    //return destination file
    return $destination_url;
}
16
Pez Cuckow

Fonction réparée:

function compressImage($source_url, $destination_url, $quality) {

    //$quality :: 0 - 100

    if( $destination_url == NULL || $destination_url == "" ) $destination_url = $source_url;

    $info = getimagesize($source_url);

    if ($info['mime'] == 'image/jpeg' || $info['mime'] == 'image/jpg')
    {
        $image = imagecreatefromjpeg($source_url);
        //save file
        //ranges from 0 (worst quality, smaller file) to 100 (best quality, biggest file). The default is the default IJG quality value (about 75).
        imagejpeg($image, $destination_url, $quality);

        //Free up memory
        imagedestroy($image);
    }
    elseif ($info['mime'] == 'image/png')
    {
        $image = imagecreatefrompng($source_url);

        imageAlphaBlending($image, true);
        imageSaveAlpha($image, true);

        /* chang to png quality */
        $png_quality = 9 - round(($quality / 100 ) * 9 );
        imagePng($image, $destination_url, $png_quality);//Compression level: from 0 (no compression) to 9(full compression).
        //Free up memory
        imagedestroy($image);
    }else
        return FALSE;

    return $destination_url;

}
4
Ferhad Konar

Vous pouvez utiliser la classe Imagick pour cela. Considérez la fonction wrapper suivante:

<?php
    function resizeImage($imagePath, $width, $height, $blur, $filterType = Imagick::FILTER_LANCZOS, $bestFit = false)
    {
        //The blur factor where &gt; 1 is blurry, &lt; 1 is sharp.
        $img= new \Imagick(realpath($imagePath));
        $img->setCompression(Imagick::COMPRESSION_JPEG); 
        $img->setCompressionQuality(40);
        $img->stripImage();
        $img->resizeImage($width, $height, $filterType, $blur, $bestFit);
        $img->writeImage();
    }

?>

En savoir plus sur la façon de redimensionner des images avec Imagick à l'adresse:
http://php.net/manual/fr/class.imagick.php
http://php.net/manual/en/imagick.resizeimage.phphttp://php.net/manual/en/imagick.constants.php # imagick.constants.filters

0
DevWL