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

Тема в разделе "PrestaShop", создана пользователем khokhlov.aser, 21 сен 2018.

Информация :
Приветствую гость, обрати внимание! Темы которые закреплены в разделах, в скором времени будут откреплены. Правила раздела PrestaShop

(Не актуальные темы) Каталоги:Модули PrestaShop 1.7Модули PrestaShop 1.5 - 1.6Шаблоны PrestaShop 1.7Шаблоны PrestaShop 1.5 - 1.6
(Не актуальные темы) Поиск / Запросы:Модули PrestaShop 1.7Модули PrestaShop 1.5 - 1.6Шаблоны PrestaShop 1.7Шаблоны PrestaShop 1.5 - 1.6
Полезная информация:Поддержка и помощь c PrestaShopУбираем ПрестаТраст, стучалки и прочую рекламуСовместные покупки модулей и шаблоновПеревод Prestashop и модулей
Модераторы: trace
  1. khokhlov.aser

    khokhlov.aser Постоялец

    Регистр.:
    1 дек 2015
    Сообщения:
    79
    Симпатии:
    121
    Стандартная библиотека 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. Модуль к примеру вот этот: https://www.nulled.cc/threads/270705/page-201#post-2848882

    всем спасибо. будут вопросы - пишите. у меня работает.
     
    filimda, vitos1401, hitbaby и 4 другим нравится это.
  2. RORC

    RORC

    Регистр.:
    14 июн 2013
    Сообщения:
    310
    Симпатии:
    105
    setImageCompressionQuality(89), для GD какое качество стояло?
     
  3. khokhlov.aser

    khokhlov.aser Постоялец

    Регистр.:
    1 дек 2015
    Сообщения:
    79
    Симпатии:
    121
    90. но вопрос не в качестве а в резкости фото. это хорошо видно в мобильной версии
     
  4. Socket_spb

    Socket_spb Постоялец

    Регистр.:
    16 апр 2015
    Сообщения:
    94
    Симпатии:
    108
    а такое есть для 1.7.х ?
     
  5. khokhlov.aser

    khokhlov.aser Постоялец

    Регистр.:
    1 дек 2015
    Сообщения:
    79
    Симпатии:
    121
  6. dilemzha

    dilemzha Создатель

    Регистр.:
    18 ноя 2018
    Сообщения:
    10
    Симпатии:
    14
  7. khokhlov.aser

    khokhlov.aser Постоялец

    Регистр.:
    1 дек 2015
    Сообщения:
    79
    Симпатии:
    121
    Если ты сделаешь перегрузку метода resize как я писал выше, то будет использовать
     
  8. genokby

    genokby Постоялец

    Регистр.:
    15 янв 2013
    Сообщения:
    107
    Симпатии:
    61
    подскажите, для nginx последовательность та же?
     
  9. khokhlov.aser

    khokhlov.aser Постоялец

    Регистр.:
    1 дек 2015
    Сообщения:
    79
    Симпатии:
    121
    у вас чистый nginx?

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

    и, в этом случае у вас скорее всего стоит php-fpm - его тоже нужно рестартануть
     
  10. temka_sd

    temka_sd Создатель

    Регистр.:
    12 апр 2012
    Сообщения:
    25
    Симпатии:
    18
    Почему это нельзя в 1.7 добавить?