web-dev-qa-db-de.com

Hochgeladene Bilder mit PHP (JPEG) optimieren

Beim Ausführen von Page Speed ​​in Google Chrome wird empfohlen, die Bilder zu optimieren/zu komprimieren. Diese Bilder werden meistens von Benutzern hochgeladen, daher müsste ich sie beim Hochladen optimieren. Was ich über das Optimieren von JPEG-Bildern mit PHP finde, ist so etwas wie das Verwenden der folgenden Gd-Funktionen:

getimagesize()
imagecreatefromjpeg()
imagejpeg()

Da ich die Bilder nach dem Hochladen in der Größe verändere, ziehe ich das Bild bereits durch diese Funktionen und benutze außerdem imagecopyresampled() nach imagecreatefromjpeg(), um die Größe zu ändern. 

Andererseits sagt mir Page Speed ​​immer noch, dass diese Bilder optimiert werden können. Wie kann ich diese Optimierung in einem PHP-Skript durchführen? Wenn Sie die Qualität in imagejpeg () niedriger einstellen, ist dies ebenfalls kein Unterschied.

13
Juvlius

In der Funktion imagejpeg legen Sie die Qualität fest. Wenn Sie dies bereits auf einen geeigneten Wert einstellen, können Sie sonst wenig tun.

Die Seitengeschwindigkeit betrachtet wahrscheinlich alle Bilder, die eine bestimmte Größe überschreiten, als "komprimierungsbedürftig". Stellen Sie möglicherweise sicher, dass sie alle so klein wie vernünftig (in Bezug auf Höhe/Breite) und komprimiert sind.

Weitere Informationen zur Geschwindigkeit der Seite und den entsprechenden Komprimierungsvorschlägen finden Sie in den pagespeed docs http://code.google.com/speed/page-speed/docs/payload.html#CompressImages , in der einige der Techniken/Tools beschrieben werden entsprechend komprimieren.

Ich habe auch gerade folgendes gelesen:

Es stehen mehrere Tools zur Verfügung, die eine weitere Komprimierung von lossless für JPEG- und PNG-Dateien ohne Auswirkung auf die Bildqualität bieten. Für JPEG empfehlen wir jpegtran oder jpegoptim (nur unter Linux verfügbar; Ausführung mit der Option --strip-all). Für PNG empfehlen wir OptiPNG oderPNGOUT.

Wenn Sie sich also wirklich an die Vorschläge von Google halten möchten, können Sie mit PHP exec eines dieser Tools für Dateien ausführen, wenn diese hochgeladen werden.


Um mit PHP zu komprimieren, machst du Folgendes (klingt, als würdest du das schon tun):

Wo $source_url das Bild ist, ist $destination_url der Ort, an dem gespeichert werden soll, und $quality ist eine Zahl zwischen 1 und 100, die die Anzahl der zu verwendenden JPEG-Komprimierung bestimmt.

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

Reparierte Funktion:

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

Sie können dafür die Imagick-Klasse verwenden. Betrachten Sie die folgende Wrapper-Funktion:

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

?>

Weitere Informationen zum Ändern der Bildgröße mit Imagick finden Sie unter:
http://php.net/manual/de/class.imagick.php
http://php.net/manual/de/imagick.resizeimage.phphttp://php.net/manual/de/imagick.constants.php # imagick.constants.filters

0
DevWL