Оптимизация загруженных изображений с помощью php (jpeg)

при запуске скорости страницы в Google Chrome он предлагает оптимизировать / сжать изображения. Эти изображения в основном загружаются пользователями, поэтому мне нужно будет оптимизировать их во время загрузки. То, что я нахожу об оптимизации изображений jpeg с помощью php, похоже на использование следующих функций GD:

getimagesize()
imagecreatefromjpeg()
imagejpeg()

поскольку я изменяю размер изображений после загрузки, я уже вытягиваю Изображение через эти функции и, кроме того, я использую imagecopyresampled() после imagecreatefromjpeg() чтобы изменить ее размер.

но тогда скорость страницы все еще говорит мне, что эти изображения можно оптимизировать. Как я могу выполнить эту оптимизацию в PHP-скрипте? Установка более низкого качества в imagejpeg () также не имеет значения.

4 ответов


функция imagejpeg, где вы назначаете качество. Если вы уже устанавливаете соответствующее значение, то вы мало что еще можете сделать.

скорость страницы, вероятно, считает, что все изображения выше определенного размера "нуждаются в сжатии", возможно, просто убедитесь, что они все такие же маленькие, как разумные (с точки зрения высоты/ширины) и сжатые.

вы можете найти больше о скорости страницы, и это предложения по сжатию на pagespeed docs http://code.google.com/speed/page-speed/docs/payload.html#CompressImages который описывает некоторые из методов / инструментов для сжатия соответствующим образом.

Я также только что прочитал следующее:

несколько инструментов доступны, которые выполняют дальше,без потерь сжатие файлов JPEG и PNG без влияния на качество изображения. Для JPEG, мы рекомендуем использовании jpegtran или jpegoptim (доступно только в Linux; запустите с опцией --strip-all). Для PNG мы рекомендуем OptiPNG или PNGOUT.

поэтому, возможно (если вы действительно хотите придерживаться предложений Google), вы можете использовать PHP exec для запуска одного из этих инструментов в файлах по мере их загрузки.


чтобы сжать php, вы делаете следующее (Похоже, вы уже делаете это):

здесь $source_url - это изображения, $destination_url где сохранить и $quality - число между 1 и 100, выбирая, сколько сжатия jpeg использовать.

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

восстановлены функции:

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;

}

для этого можно использовать класс 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 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


очень важно оптимизировать ваши изображения. Несколько платформ CMS имеют модули или плагины для подготовки этого процесса. Однако, если вы программируете его самостоятельно, на этой странице находится полный учебник по phphttps://a1websitepro.com/optimize-images-with-php-in-a-directory-on-your-server/ Вам будет показано, как реализовать imagecreatefromjpeg($SrcImage); и imagecreatefrompng($SrcImage); и imagecreatefromgif($SrcImage); есть письменные и видео инструкции на этой странице.