Битрикс: Автоматическая конвертация в webP и вывод изображений в шаблоне сайта
Rus
Eng
Битрикс: Автоматическая конвертация в webP и вывод изображений в шаблоне сайта
Решаю сложные технические задачи для Bitrix и 1С: от аудита чужого кода до разработки сайтов и настройки сложных интеграций с гарантией результата
Рекомендую

Хостинг для сайта

Если выбираете хостинг под проект — советую Timeweb. Современная инфраструктура, широкий выбор тарифов от стартовых до VPS под нагрузку, отзывчивая техподдержка, которая отвечает по существу, а не отписками. Я сам держу на нём часть своих проектов и рекомендую клиентам.

Перейти Партнёрская ссылка. Для вас цена не меняется.

Кроссбраузерное использование webp

В данный момент формат webp поддерживают не все версии safari. Но есть кроссбраузерный способ использовать webp

<picture class="b_426">
	<source srcset="<?=getWebP($from)?> 1x, <?=getWebP($fromRetina)?>  2x" type="image/webp">
	<source srcset="<?=$from?> 1x, <?=$fromRetina?>  2x" type="image/jpeg">
	<img title="<?=$name?>" src="<?=getWebP($small)?>">
</picture>

Как на php определить, что браузер поддерживает webp

Но мы можем воспользоваться более простым методом. Он несколько проще, потому что позволяет использовать webp в качестве фонового изображения

/* Проверяем поддержку webp */
global $WEBP;
if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false || strpos($_SERVER['HTTP_USER_AGENT'], ' Chrome/' ) !== false )
	$WEBP = true; // webp поддерживается
else
	$WEBP = false; // webp не поддерживается

Простой, без мук способ конвертации jpg => webp

function getWebP($src){//Определяем нужно ли добавлять union к массовому запросу
    if(!$src){
        return false;
    }

    $source = $_SERVER['DOCUMENT_ROOT'].$src;
    $destination = $source . '.webp';

    if (!file_exists($destination)) {
        //Максимум, фото расплывается
        //exec("cwebp -q 0 ".$from." -o ".$to." ");

        //Нормал, хорошее качество с серьезным сжатием
        //cwebp -q 80 source.png -o destination.webp
        exec("convert -colorspace RGB ".$src." ".$destination . " ");
        $src = $src.'.webp';
    }else{
        $src = $src.'.webp';
    }

    return $src;
}

$from    =   "1.jpg";
$to   =   "1.jpg.webp";

Если конвертация не происходит, то вам нужно либо самому, либо через хостера установить утилиту libwebp

//CentOS 6
sudo apt-get install webp

//CentOS 7
sudo yum install libwebp-tools

Bash для автоматической конвертации файлов в webp в директории

#!/bin/bash

# converting JPEG images
find $1 -type f -and \( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec bash -c '
webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
if [ ! -f "$webp_path" ]; then
  cwebp -quiet -q 90 "$0" -o "$webp_path";
fi;' {} \;

# converting PNG images
find $1 -type f -and -iname "*.png" \
-exec bash -c '
webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
if [ ! -f "$webp_path" ]; then
  cwebp -quiet -lossless "$0" -o "$webp_path";
fi;' {} \;

Bash скрипт взят отсюда

Так же libwebp можно взять отсюда

Установка серверных библиотек ImageMagickk

Устанавливаем Development Tools

yum groupinstall "Development Tools"  -y

Устанавливаем php-pear, php-devel и gcc пакеты для компиляции imagick PHP расширения

yum install php-pear php-devel gcc

Устанавливаем ImageMagick

yum install ImageMagick
yum install ImageMagick-devel
pecl install Imagick

Если все хорошо, то вы увидите, примерно, следующее:

Installing '/usr/include/php/ext/imagick/php_imagick_shared.h'
Installing '/usr/lib64/php/modules/imagick.so'
install ok: channel://pecl.php.net/imagick-3.4.4
configuration option "php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini

Проверить успешность установки можно так:

convert --version

Включаем расширение imagick в php.ini

; When the extension library to load is not located in the default extension
; directory, You may specify an absolute path to the library file:
;
;   extension=/path/to/extension/mysqli.so
;
; Note : The syntax used in previous PHP versions ('extension=<ext>.so' and
; 'extension='php_<ext>.dll') is supported for legacy reasons and may be
; deprecated in a future PHP major version. So, when it is possible, please
; move to the new ('extension=<ext>) syntax.
extension=imagick.so

Можем перезагрузить apache, можем этого не делать (у меня заработало и так)

systemctl reload httpd

Статья на тему Install ImageMagick in Centos7

Установка системных библиотек

Ставим композер через ssh

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Ставим библиотеку WebP Convert. Найти ее можно здесь

composer require rosell-dk/webp-convert

Используем в Битрикс

В init.php добавляем

require($_SERVER['DOCUMENT_ROOT'].'/local/libs/init/webP.php');

Листинг файла webP.php

require_once ($_SERVER['DOCUMENT_ROOT'].'/vendor/autoload.php');

use WebPConvert\WebPConvert;
use WebPConvert\Convert\Converters\Stack;

class aWebP
{
    public function __construct() {

    }

    public function getWebP($src){//Определяем нужно ли добавлять union к массовому запросу
        if(!$src){
            return false;
        }

        $source = $_SERVER['DOCUMENT_ROOT'].$src;
        $destination = $source . '.webp';

        $options = [
            'fail' => 'original',     // If failure, serve the original image (source). Other options include 'throw', '404' and 'report'
            //'show-report' => true,  // Generates a report instead of serving an image
            'serve-image' => [
                'headers' => [
                    'cache-control' => true,
                    'vary-accept' => true,
                    // other headers can be toggled...
                ],
                'cache-control-header' => 'max-age=2',
            ],
            'converters' => [
                'cwebp', 'vips', 'imagick', 'gmagick', 'imagemagick', 'graphicsmagick', 'wpc', 'ewww', 'gd'
            ],
        ];

        if (!file_exists($destination)) {
            WebPConvert::convert($source, $destination, $options);
            $src = $src.'.webp';
        }else{
            $src = $src.'.webp';
        }

        return $src;
    }
}

Использование в шаблоне

$aWebP = new aWebP;
echo $aWebP->getWebP($imgUrl);

Опции конвертации в таком варианте не действуют. Вы не сможете выбрать качество изображения (у меня не удалось, может получится у Вас).

Использование автоматических настроек позволит в среднем сэкономить на несжатом изображении 30-60%, на сжатом и оптимизированном через API Битрикс 5-15%

Александр Тихий
Автор статьи

Александр Тихий

Fullstack-разработчик · 1С-Битрикс

Разрабатываю и развиваю интернет-магазины и корпоративные порталы на 1С-Битрикс. Интеграции с 1С, highload-нагрузки, безопасность по 152-ФЗ.


Комментарии

Комментариев еще нет, Вы можете стать первым кто его оставит

Оставьте комментарий

На сайте используется система премодерирования комментариев, поэтому ваше сообщение будет опубликовано лишь после одобрения модератором

Вы отвечаете на комментарий пользователя

Отправить

ОБРАТНАЯ СВЯЗЬ

Напишите мне

Напишите мне, чтобы обсудить задачу. Работаю удаленно, официально (самозанятый), стоимость часа — 1800 ₽, в день могу уделять проекту 3–4 часа. Отвечаю быстро, консультация бесплатная.

Во время отправки произошла ошибка, пожалуйста попробуйте еще раз через некоторое время
Сообщение отправлено успешно

Телефоны

+7(993) 007-18-96

Email

info@tichiy.ru

Адрес

Россия, г. Москва

Отправляя форму Вы автоматически подтверждаете, что ознакомились и принимаете Политику конфиденциальности сайта