web-dev-qa-db-ja.com

アップロードされた画像をphp(jpeg)で最適化する

GoogleでPage Speedを実行する場合Chrome画像を最適化/圧縮することをお勧めします。これらの画像は主にユーザーによってアップロードされるため、アップロード時に最適化する必要があります。jpeg画像の最適化についてphpは、次のGd関数を使用するようなものです。

_getimagesize()
imagecreatefromjpeg()
imagejpeg()
_

アップロード後に画像のサイズを変更しているので、これらの関数を使用して画像をすでに取得しています。さらに、imagecopyresampled()の後にimagecreatefromjpeg()を使用して画像のサイズを変更しています。

しかし、それでもPage Speedはこれらの画像を最適化できると私に伝えています。 PHPスクリプトでこの最適化を行うにはどうすればよいですか? imagejpeg()で品質を低く設定しても違いはありません。

12
Juvlius

Imagejpeg関数は、品質を割り当てる場所です。すでに適切な値に設定している場合は、他にできることはほとんどありません。

ページ速度はおそらく、特定のサイズを超えるすべての画像を「圧縮が必要」であると見なします。おそらく、それらがすべて適切な大きさ(高さ/幅の点で)小さく、圧縮されていることを確認してください。

ページスピードの詳細と圧縮の提案については、pagespeedのドキュメント http://code.google.com/speed/page-speed/docs/payload.html#CompressImages をご覧ください。適切に圧縮するためのテクニック/ツール。

私はまた、以下を読みました:

画質に影響を与えずに、JPEGおよびPNGファイルでlossless圧縮をさらに実行するいくつかのツールが利用可能です。 JPEGの場合、jpegtranまたはjpegoptim(Linuxでのみ使用可能)をお勧めします。 --strip-allオプションで実行します)。 PNGの場合、OptiPNGまたは)[〜#〜] pngout [〜#〜]

したがって、おそらく(本当にGoogleの提案に固執したい場合は)、PHPのexecを使用して、アップロードされたファイルに対してこれらのツールの1つを実行できます。


Phpで圧縮するには、次のようにします(すでにこれを行っているようです)。

どこ $source_urlは画像、$destination_urlは保存先であり、$qualityは、使用するJPEG圧縮の量を選択する1〜100の数値です。

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
Pez Cuckow

修復された機能:

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

これにはImagickクラスを使用できます。次のラッパー関数を検討してください。

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

?>

Imagickで画像のサイズを変更する方法の詳細については、以下をご覧ください。
http://php.net/manual/en/class.imagick.php
http://php.net/manual/en/imagick.resizeimage.phphttp://php.net/manual/en/imagick.constants.php #imagick.constants.filters

0
DevWL