Оценок: 1
551
Opencart поддержка webp. Вывод .jpg и .png как .webp

Opencart поддержка webp. Вывод .jpg и .png как .webp

Проверено на Opencart 3. Понадобится +/- 15 минут

После применения всех изменений, .jpg и .png изображения на сайте, к которым применяется изменение размера, будут выводиться в формате .webp (только в таком формате, независимо от браузера). Если же вам достаточно только добавить поддержку webp, смотрите в статье, какие изменения в этом случае лишние и не делайте их.

Если правильность вывода в старых версиях браузеров не важна, такой способ подойдет, иначе нужно смотреть или в сторону тега picture, или скрипта, который будет проверять поддерживает ли браузер webp и в зависимости от результата выводить нужное изображение

В этом варианте вносятся изменения в библиотеку image, а также в модель tool/image (в admin и catalog, всего 3 файла). Никаких правок в контроллерах и шаблонах не требуется.

Изменения в библиотеке image

Начать лучше с библиотеки /system/library/image.php, поскольку именно здесь происходит основная обработка и сюда идет обращение из моделей

Из коробки Opencart создает миниатюры для gif, png и jpeg. Добавим webp, для этого сначала найдем:

			if ($this->mime == 'image/gif') {
				$this->image = imagecreatefromgif($file);
			} elseif ($this->mime == 'image/png') {
				$this->image = imagecreatefrompng($file);
			} elseif ($this->mime == 'image/jpeg') {
				$this->image = imagecreatefromjpeg($file);
			}

И добавим еще одну проверку с вызовом функции imagecreatefromwebp():

			elseif ($this->mime == 'image/webp') {
				$this->image = imagecreatefromwebp($file);
			}

В результате должно получиться вот так:

			if ($this->mime == 'image/gif') {
				$this->image = imagecreatefromgif($file);
			} elseif ($this->mime == 'image/png') {
				$this->image = imagecreatefrompng($file);
			} elseif ($this->mime == 'image/jpeg') {
				$this->image = imagecreatefromjpeg($file);
			} elseif ($this->mime == 'image/webp') {
				$this->image = imagecreatefromwebp($file);
			}

Далее найдем ту часть, где изображение сохраняется в файл:

			if ($extension == 'jpeg' || $extension == 'jpg') {
				imagejpeg($this->image, $file, $quality);
			} elseif ($extension == 'png') {
				imagepng($this->image, $file);
			} elseif ($extension == 'gif') {
				imagegif($this->image, $file);
			}

Если вам нужна только поддержка webp, достаточно будет добавить сюда следующее:

			elseif ($extension == 'webp') {
				imagewebp($this->image, $file);
			}

Если же в webp нужно конвертировать jpg и png, то нужно заменить функции imagejpeg() и imagepng() на функцию imagewebp(), в результате получится так:

			if ($extension == 'jpeg' || $extension == 'jpg') {
				imagewebp($this->image, $file, $quality);
			} elseif ($extension == 'png') {
				imagewebp($this->image, $file);
			} elseif ($extension == 'gif') {
				imagegif($this->image, $file);
			} elseif ($extension == 'webp') {
				imagewebp($this->image, $file);
			}

Изменения в моделях

Теперь переходим к правкам в моделях /catalog/model/tool/image.php и /admin/model/tool/image.php. Изменения в обоих файлах одинаковые.

Для начала сделаем так, что бы модель обрабатывала webp, а не игнорировала. Находим:

if (!in_array($image_type, array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF))) {

Добавим к этому списку IMAGETYPE_WEBP. Получим:

if (!in_array($image_type, array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_WEBP))) {

Следующая правка нужна, только если хотите выводить jpeg и png как webp.

Если в библиотеке делали замену функций imagejpeg() и imagepng() на функцию imagewebp(), эта правка нужна, если не делали - не нужа.

Находим:

$extension = pathinfo($filename, PATHINFO_EXTENSION);

Ниже добавляем (делаем замену расширения файла):

$extension = str_replace(array('png','jpg','jpeg'),'webp',$extension);

Вот и все изменения.

Оценок: 1

Комментарии (0)

    Надежный хостинг VPS серверов
    • Свои ISO образы
    • VDS с оплатой раз и навсегда
    • Аренда VDS на любой срок, с оплатой по дням
    • Большое разнообразие конфигураций
    • Дата-центры в ЕС и России
    + скидка 10%