Информация Меняем обработчик изображений с GD на ImageMagic

khokhlov.aser

Постоялец
Регистрация
1 Дек 2015
Сообщения
91
Реакции
184
Стандартная библиотека GD делает на редкость мыльные фото. Как навести резкость на всех фото и уменьшить их размер?
Использовать библиотеку ImageMagic для обработки.

Требования :
- доступ к серверу если не установлено.
- Prestashop 1.6

Если не установлено, то устанавливаем:

Код:
sudo apt-get update
sudo apt-get install php5-imagick
sudo php5enmod imagick

Не забываем рестартануть Апаче

Код:
sudo service apache2 restart

Далее создаем файл override/classes/ImageManager.php

Содержимое:

Код:
<?php

class ImageManager extends ImageManagerCore
{

    /**
     * Resize, cut and optimize image
     *
     * @param string $src_file   Image object from $_FILE
     * @param string $dst_file   Destination filename
     * @param int    $dst_width  Desired width (optional)
     * @param int    $dst_height Desired height (optional)
     * @param string $file_type
     * @param bool   $force_type
     * @param int    $error
     * @param int    $tgt_width
     * @param int    $tgt_height
     * @param int    $quality
     * @param int    $src_width
     * @param int    $src_height
     * @return bool Operation result
     */
    public static function resize($src_file, $dst_file, $dst_width = null, $dst_height = null, $file_type = 'jpg',
                                $force_type = false, &$error = 0, &$tgt_width = null, &$tgt_height = null, $quality = 5,
                                &$src_width = null, &$src_height = null)
    {
        if (PHP_VERSION_ID < 50300) {
            clearstatcache();
        } else {
            clearstatcache(true, $src_file);
        }

        if (!file_exists($src_file) || !filesize($src_file)) {
            return !($error = self::ERROR_FILE_NOT_EXIST);
        }

        list($src_width, $src_height, $type) = getimagesize($src_file);

        // If PS_IMAGE_QUALITY is activated, the generated image will be a PNG with .jpg as a file extension.
        // This allow for higher quality and for transparency. JPG source files will also benefit from a higher quality
        // because JPG reencoding by GD, even with max quality setting, degrades the image.
        if (Configuration::get('PS_IMAGE_QUALITY') == 'png_all'
            || (Configuration::get('PS_IMAGE_QUALITY') == 'png' && $type == IMAGETYPE_PNG) && !$force_type) {
            $file_type = 'png';
        }

        if (!$src_width) {
            return !($error = self::ERROR_FILE_WIDTH);
        }
        if (!$dst_width) {
            $dst_width = $src_width;
        }
        if (!$dst_height) {
            $dst_height = $src_height;
        }
       
        $width_diff = $dst_width / $src_width;
        $height_diff = $dst_height / $src_height;

        $ps_image_generation_method = Configuration::get('PS_IMAGE_GENERATION_METHOD');
        if ($width_diff > 1 && $height_diff > 1) {
            $next_width = $src_width;
            $next_height = $src_height;
        } else {
            if ($ps_image_generation_method == 2 || (!$ps_image_generation_method && $width_diff > $height_diff)) {
                $next_height = $dst_height;
                $next_width = round(($src_width * $next_height) / $src_height);
                $dst_width = (int)(!$ps_image_generation_method ? $dst_width : $next_width);
            } else {
                $next_width = $dst_width;
                $next_height = round($src_height * $dst_width / $src_width);
                $dst_height = (int)(!$ps_image_generation_method ? $dst_height : $next_height);
            }
        }

        if (!ImageManager::checkImageMemoryLimit($src_file)) {
            return !($error = self::ERROR_MEMORY_LIMIT);
        }
       
        //Set Imagick Object values
        $src_image = new Imagick();
        $src_image->readImage($src_file);
        $src_image->setImageCompression(Imagick::COMPRESSION_JPEG);
        $src_image->setInterlaceScheme(Imagick::INTERLACE_PLANE);
        $src_image->setImageCompressionQuality(89);
        $src_image->sharpenimage(2, 0.5, 134217727);
        $src_image->gaussianBlurImage(0.03,0.03);
        $src_image->stripImage();
        $src_image->thumbnailImage($dst_width, $dst_height, Imagick::FILTER_SINC, 1);
       
        //Output the final Image using Imagick
        return $src_image->writeImage($dst_file);
       

    }


}

Всё. Перегенерируем необходимые форматы изображений. После чистим кэш.

Есть ограничения :
- не работает с прозрачными PNG. Фон будет залит белым.
- время перегенерации увеличивается. Рекомендую использовать модуль для перегенерации пачками. Иначе можно получить Timeout. Модуль к примеру вот этот: Для просмотра ссылки Войди или Зарегистрируйся

всем спасибо. будут вопросы - пишите. у меня работает.
 
setImageCompressionQuality(89), для GD какое качество стояло?
 
подскажите, для nginx последовательность та же?
 
подскажите, для nginx последовательность та же?

у вас чистый nginx?

Если да, то нужно рестартнуть
sudo service nginx restart

и, в этом случае у вас скорее всего стоит php-fpm - его тоже нужно рестартануть
 
Почему это нельзя в 1.7 добавить?
 
Назад
Сверху