it-swarm.com.ru

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

При запуске Page Speed ​​в Google Chrome предлагается оптимизировать/сжать изображения. Эти изображения в основном загружаются пользователями, поэтому мне нужно оптимизировать их во время загрузки. Что я нахожу в оптимизации изображений JPEG с помощью php, это что-то вроде использования следующих функций Gd:

getimagesize()
imagecreatefromjpeg()
imagejpeg()

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

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

13
Juvlius

Функция imagejpeg - это место, где вы назначаете качество. Если вы уже устанавливаете это на подходящее значение, тогда вы мало что можете сделать.

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

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

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

Доступно несколько инструментов, которые выполняют дальнейшее сжатие lossless для файлов 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;
}
16
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