Opencart - Адаптивное Изменение Размеров Изображений (crop, Resize)

Тема в разделе "Шаблоны, дизайн и оформление магазина", создана пользователем admin, 17 июн 2016.

  1. TopicStarter Overlay
    Offline

    admin Команда форума Администратор

    Сообщения:
    2.595
    Симпатии:
    111.263
    Репутация:
    175
    С обработкой изображений в Opencart дела обстоят не очень плохо, но все же, примерно в 50% случаев, возникает необходимость сначала обрезать, а уже потом уменьшать изображения до заданных в настройках размеров. Таким образом, в не зависимости от пропорций исходного изображения, при выводе изображений мы всегда получаем изображение, занимающее максимум от возможного места без белых полей по краям. Это решение будет оптимально если большинство изображений на сайте имеют фон, отличный от белого (наверное актуально в основном для стандартной темы).

    Все изображения товаров, категорий, т.е. все те изображения, которые мы загружаем с помощью полей вроде

    eb5d99f6a04da3468c42bc192766cfd37b1e8ecd.jpg

    при выводе будут уменьшены (увеличены) до размеров, заданных в настройках OpenCart

    f526aa703311a0947b45143f6f414bc917a289c9.jpg

    За ресайз изображений в Opencart отвечает класс ModelToolImage, находящийся вcatalog/model/tool/image.php.

    Вариант 1. Если необходимо, чтобы абсолютно все изображения обрабатывались по нашей схеме, то замените полностью метод resize на


    Код:
    public function resize($filename, $width, $height, $type = "") {
    
         if (!file_exists(DIR_IMAGE . $filename) || !is_file(DIR_IMAGE . $filename)) {
           return;
         }
    
         $info = pathinfo($filename);
    
         $extension = $info['extension'];
    
         $old_image = $filename;
    
         $new_image = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . $width . 'x' . $height . $type .'.' . $extension;
    
         if (!file_exists(DIR_IMAGE . $new_image) || (filemtime(DIR_IMAGE . $old_image) > filemtime(DIR_IMAGE . $new_image))) {
           $path = '';       
    
           $directories = explode('/', dirname(str_replace('../', '', $new_image)));
    
           foreach ($directories as $directory) {
             $path = $path . '/' . $directory;
    
             if (!file_exists(DIR_IMAGE . $path)) {
               @mkdir(DIR_IMAGE . $path, 0777);
             }
           }
    
           list($width_orig, $height_orig) = getimagesize(DIR_IMAGE . $old_image);
    
           if ($width_orig != $width || $height_orig != $height) {
    
      $scaleW = $width_orig/$width;
      $scaleH = $height_orig/$height;
    
      $image = new Image(DIR_IMAGE . $old_image);
    
      if ($scaleH > $scaleW) {
      $_height = $height * $scaleW;
    
      $top_x = 0;
      $top_y = ($height_orig - $_height) / 2;
    
      $bottom_x = $width_orig;
      $bottom_y = $top_y + $_height;
    
      $image->crop($top_x, $top_y, $bottom_x, $bottom_y);
      } elseif ($scaleH < $scaleW) {
      $_width = $width * $scaleH;
    
      $top_x = ($width_orig - $_width) / 2;
      $top_y = 0;
    
      $bottom_x = $top_x + $_width;
      $bottom_y = $height_orig;
    
      $image->crop($top_x, $top_y, $bottom_x, $bottom_y);
      }
    
      $image->resize($width, $height, $type);
             $image->save(DIR_IMAGE . $new_image);
           } else {
             copy(DIR_IMAGE . $old_image, DIR_IMAGE . $new_image);
           }
         }     
    
         if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
           return $this->config->get('config_ssl') . 'image/' . $new_image;
         } else {
           return $this->config->get('config_url') . 'image/' . $new_image;
         }
       }
    Вариант 2. Если такая обработка подходит не всегда, а только в отдельных случаях, то добавьте следующий код перед определением метода resize

    Код:
       public function myResize($filename, $width, $height, $type = "") {
    
         if (!file_exists(DIR_IMAGE . $filename) || !is_file(DIR_IMAGE . $filename)) {
           return;
         }
    
         $info = pathinfo($filename);
    
         $extension = $info['extension'];
    
         $old_image = $filename;
    
         $new_image = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . $width . 'x' . $height . $type .'.' . $extension;
    
         if (!file_exists(DIR_IMAGE . $new_image) || (filemtime(DIR_IMAGE . $old_image) > filemtime(DIR_IMAGE . $new_image))) {
           $path = '';       
    
           $directories = explode('/', dirname(str_replace('../', '', $new_image)));
    
           foreach ($directories as $directory) {
             $path = $path . '/' . $directory;
    
             if (!file_exists(DIR_IMAGE . $path)) {
               @mkdir(DIR_IMAGE . $path, 0777);
             }
           }
    
           list($width_orig, $height_orig) = getimagesize(DIR_IMAGE . $old_image);
    
           if ($width_orig != $width || $height_orig != $height) {
    
      $scaleW = $width_orig/$width;
      $scaleH = $height_orig/$height;
    
      $image = new Image(DIR_IMAGE . $old_image);
    
      if ($scaleH > $scaleW) {
      $_height = $height * $scaleW;
    
      $top_x = 0;
      $top_y = ($height_orig - $_height) / 2;
    
      $bottom_x = $width_orig;
      $bottom_y = $top_y + $_height;
    
      $image->crop($top_x, $top_y, $bottom_x, $bottom_y);
      } elseif ($scaleH < $scaleW) {
      $_width = $width * $scaleH;
    
      $top_x = ($width_orig - $_width) / 2;
      $top_y = 0;
    
      $bottom_x = $top_x + $_width;
      $bottom_y = $height_orig;
    
      $image->crop($top_x, $top_y, $bottom_x, $bottom_y);
      }
    
      $image->resize($width, $height, $type);
             $image->save(DIR_IMAGE . $new_image);
           } else {
             copy(DIR_IMAGE . $old_image, DIR_IMAGE . $new_image);
           }
         }     
    
         if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
           return $this->config->get('config_ssl') . 'image/' . $new_image;
         } else {
           return $this->config->get('config_url') . 'image/' . $new_image;
         }
       }
    Далее там, где это необходимо - заменить вызов $this->model_tool_image->resize(...), на $this->model_image_tool->myResize(...).
     
    vinograd нравится это.
  2. Offline

    vinograd Пользователь

    Сообщения:
    10
    Симпатии:
    3
    Репутация:
    0
    Спасибо, как раз то что нужно!:)
     
  3. Offline

    landerlive47 Пользователь

    Сообщения:
    51
    Симпатии:
    4
    Репутация:
    0
    А для OP2?
     
  4. Offline

    webGeorg Пользователь

    Сообщения:
    13
    Симпатии:
    7
    Репутация:
    0
    бывает так..... после импорта товара от поставщика на опенкарт, фото имеет большой размер (у меня был такой случай, изображение 2,5 мб :upset:)
    можно оптимизировать изображение по ssh (centos)
    Код:
    cd /home/admin/web/public_html/image/data/i/
    find . -name '*.jpg' | xargs jpegoptim -m65 --strip-all
    
    cd /home/admin/web/public_html/image/data/i/ - путь до вашей папки с изображениями на сервере.
    -m65 - это сепень сжатия изображения
    (можно указать свое сжатие.... например -m45)
    После выполнения не забудьте очистить старый cache изображений!
     
    DaSS и admin нравится это.
  5. Offline

    DaSS Пользователь

    Сообщения:
    54
    Симпатии:
    33
    Репутация:
    11
    Спасибо, очень помогло