PHP

Изображения WebP в PHP

WebP – формат сжатия изображений, разработанный Google. Имеет более меньший размер файла по сравнению с JPG, но не поддерживается продуктами Apple. В PHP поддержка формата появилась с версии 5.4.0.

1

Конвертирование в WebP

JPG в WebP

$src = __DIR__ . '/image.jpg';
$info = pathinfo($src);

$img = imageCreateFromJpeg($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);
PHP

PNG в WebP

$src = __DIR__ . '/image.png';
$info = pathinfo($src);

$img = imageCreateFromPng($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);
PHP

GIF в WebP

$src = __DIR__ . '/image.gif';
$info = pathinfo($src);

$img = imageCreateFromGif($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);
PHP

Вывод в браузер

header('Content-Type: image/webp');
imageWebp($img, null, 100);
PHP
2

WebP в другие форматы

JPG

$src = __DIR__ . '/image.webp';
$info = pathinfo($src);

$img = imageCreatefromWebp($src);
imageJpeg($img, $info['dirname'] . '/' . $info['filename'] . '.jpg', 100);
imagedestroy($img);
PHP

Вывод в браузер:

header('Content-Type: image/jpeg');
imageJpeg($img, null, 100);
PHP

PNG

$src = __DIR__ . '/image.webp';
$info = pathinfo($src);

$img = imageCreatefromWebp($src);
imagePng($img, $info['dirname'] . '/' . $info['filename'] . '.png');
imagedestroy($img);
PHP

Вывод в браузер:

header('Content-Type: image/x-png');
imagePng($img);
PHP

GIF

$src = __DIR__ . '/image.webp';
$info = pathinfo($src);

$img = imageCreatefromWebp($src);
imageGif($img, $info['dirname'] . '/' . $info['filename'] . '.gif');
imagedestroy($img);
PHP

Вывод в браузер:

header('Content-Type: image/gif');
imageGif($img);
PHP
3

Баг PHP WebP

В библиотеке GD, в функции imageCreatefromWebp() есть ошибка из-за которой изображение теряет синий канал. Сообщалось что ошибка исправлена с PHP >= 5.6.12, но баг может встречаться на сборках PHP 7.

Оригинал Результат

Исправить этот баг можно функцией:

function fixBlue($img)
{
    $tmp = imagecreatetruecolor(imagesx($img),imagesy($img));
    $color = imagecolorallocate($tmp, 255, 255, 255);
    imagefill($tmp, 0, 0, $color);

    for ($y = 0; $y < imagesy($img); $y++) {
        for ($x=0; $x < imagesx($img); $x++) {
            $rgb = imagecolorat($img, $x, $y);
            $r = ($rgb >> 24) & 0xFF;
            $g = ($rgb >> 16) & 0xFF;
            $b = ($rgb >> 8) & 0xFF;
            $pixelcolor = imagecolorallocate($tmp, $r, $g, $b);
            imagesetpixel($tmp, $x, $y, $pixelcolor);
        }
    }
    return $tmp;
}
PHP

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

$src = __DIR__ . '/image.webp';
$info = pathinfo($src);

$img = imageCreatefromWebp($src);
$img = fixBlue($img);
imageJpeg($img, $info['dirname'] . '/' . $info['filename'] . '.jpg');
imagedestroy($img);
PHP
07 июля 2019

Другие публикации

Если нужно запретить выполнение скриптов php в директории, например в uploads, нужно поместить туда файл .htaccess со...
PHP функции для транслита текста на русском языке по ГОСТ 7.79-2000 (ИСО 9-95) система «Б»
В статье представлены различные PHP расширения для чтения файлов XLS, XLSX. Описаны их плюсы и минусы, а также примеры...
Расширение PHPMailer позволят легко отправить письма с сайта, избегая проблем с кодировкой и вложениями.