admin Опубликовано 19 марта, 2022 Поделиться Опубликовано 19 марта, 2022 Хотя с обработкой изображений в Opencart дела обстоят не очень плохо, но все же, примерно в 50% случаев, возникает необходимость сначала обрезать, а уже потом уменьшать изображения до заданных в настройках размеров. Таким образом, в не зависимости от пропорций исходного изображения, при выводе изображений мы всегда получаем изображение, занимающее максимум от возможного места без белых полей по краям. Это решение будет оптимально если большинство изображений на сайте имеют фон, отличный от белого (наверное актуально в основном для стандартной темы). За ресайз изображений в 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(...). 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.