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

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

  1. TopicStarter Overlay
    Online

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

    Сообщения:
    2.321
    Симпатии:
    76.611
    Репутация:
    170
    С обработкой изображений в 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
    Симпатии:
    2
    Репутация:
    0
    Спасибо, как раз то что нужно!:)