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

lors de L'exécution de Page Speed dans Google Chrome il suggère d'optimiser/compresser les images. Ces images sont principalement téléchargées par les utilisateurs, donc je devrais les optimiser pendant le téléchargement. Ce que je trouve à propos de l'optimisation des images jpeg avec php, c'est quelque chose comme utiliser les fonctions GD suivantes:

getimagesize()
imagecreatefromjpeg()
imagejpeg()

depuis que je redimensionne les images après le téléchargement je tire déjà l'image à travers ces fonctions et en plus j'utilise imagecopyresampled() après imagecreatefromjpeg() pour le redimensionner.

mais alors, Page Speed me dit toujours que ces images peuvent être optimisées. Comment réaliser cette optimisation dans un script php? Définir la qualité inférieure dans imagejpeg() ne fait pas de différence.

13
demandé sur Juvlius 2012-12-28 20:19:17

4 réponses

La fonction imagejpeg est l'endroit où vous attribuer la qualité. Si vous mettez déjà cette valeur à une valeur appropriée, alors il n'y a rien d'autre que vous puissiez faire.

page speed considère probablement toutes les images au-dessus d'une certaine taille comme "nécessitant une compression", peut-être juste s'assurer qu'elles sont toutes aussi petites que raisonnables (en termes de hauteur/largeur) et compressées.

vous pouvez en savoir plus sur la vitesse de page et ses suggestions de compression sur les docs pagespeed http://code.google.com/speed/page-speed/docs/payload.html#CompressImages qui décrit quelques-unes des techniques / outils pour compresser de façon appropriée.

je viens juste de lire la suivante:

plusieurs outils sont disponibles qui performent plus loin, sans perte compression sur les fichiers JPEG et PNG, sans effet sur la qualité de l'image. Pour JPEG, nous recommandons jpegtran ou jpegoptim (disponible sur Linux seulement; exécutez avec l'option -- strip-all). Pour PNG, nous recommandons OptiPNG ou PNGOUT.

alors peut-être (si vous voulez vraiment vous en tenir aux suggestions de Google) vous pourriez utiliser PHP exec pour exécuter l'un de ces outils sur les fichiers tels qu'ils sont téléchargés.


compresser avec php, vous procédez de la manière suivante (on dirait que vous le faites déjà ça):

$source_url est l'image, $destination_url est l'emplacement où enregistrer et $quality est un nombre entre 1 et 100 choisir combien 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;
}
15
répondu Pez Cuckow 2014-10-28 10:31:59

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
répondu Ferhad Konar 2017-11-21 20:22:16

Vous pouvez utiliser la classe Imagick pour cela. Envisagez la fonction 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 les images avec Imagick at:

http://php.net/manual/en/class.imagick.php

http://php.net/manual/en/imagick.resizeimage.php http://php.net/manual/en/imagick.constants.php#imagick.constants.filters

0
répondu DevWL 2018-03-24 20:40:20

il est très important d'optimiser vos images. Plusieurs plateformes CMS ont modules ou plugins pour préformer ce processus. Cependant, si vous le programmez vous-même, il y a un tutoriel php complet situé à cette page https://a1websitepro.com/optimize-images-with-php-in-a-directory-on-your-server/ on vous montrera comment mettre en œuvre le imagecreatefromjpeg($SrcImage); et imagecreatefrompng($SrcImage); et imagecreatefromgif($SrcImage); il y a des instructions écrites et vidéo sur la page.

-1
répondu user2970934 2015-03-29 16:44:32