WebP – формат сжатия изображений, разработанный Google. Имеет более меньший размер файла по сравнению с JPG, но не поддерживается продуктами Apple. В PHP поддержка формата появилась с версии 5.4.0.
JPG в WebP
$src = __DIR__ . '/image.jpg';
$info = pathinfo($src);
$img = imageCreateFromJpeg($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);
PNG в WebP
$src = __DIR__ . '/image.png';
$info = pathinfo($src);
$img = imageCreateFromPng($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);
GIF в WebP
$src = __DIR__ . '/image.gif';
$info = pathinfo($src);
$img = imageCreateFromGif($src);
imageWebp($img, $info['dirname'] . '/' . $info['filename'] . '.' . 'webp', 100);
imagedestroy($img);
Вывод в браузер
JPG
$src = __DIR__ . '/image.webp';
$info = pathinfo($src);
$img = imageCreatefromWebp($src);
imageJpeg($img, $info['dirname'] . '/' . $info['filename'] . '.jpg', 100);
imagedestroy($img);
Вывод в браузер:
PNG
$src = __DIR__ . '/image.webp';
$info = pathinfo($src);
$img = imageCreatefromWebp($src);
imagePng($img, $info['dirname'] . '/' . $info['filename'] . '.png');
imagedestroy($img);
Вывод в браузер:
GIF
$src = __DIR__ . '/image.webp';
$info = pathinfo($src);
$img = imageCreatefromWebp($src);
imageGif($img, $info['dirname'] . '/' . $info['filename'] . '.gif');
imagedestroy($img);
Вывод в браузер:
1. Баг c цветами
В библиотеке 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;
}
Использование:
$src = __DIR__ . '/image.webp';
$info = pathinfo($src);
$img = imageCreatefromWebp($src);
$img = fixBlue($img);
imageJpeg($img, $info['dirname'] . '/' . $info['filename'] . '.jpg');
imagedestroy($img);
2. Битые файлы
Некоторые файлы сгенерированные через PHP GD могут не открываться – причина тут в отсутствии нулевого байта в конце файла, из-за этого браузер считает такие изображения битыми. Исправляется следующим фиксом:
$file = __DIR__ . '/фото.jpg';
$new = __DIR__ . '/фото.webp';
$img = imageCreateFromJpg($file);
imageWebp($img, $new, 100);
imagedestroy($img);
if (filesize($new) % 2 == 1) {
file_put_contents($new, "\0", FILE_APPEND);
}
3. Теряется прозрачность при сохранении PNG в WEBP
До версии библиотеки GD 2.2.5 у WEBP нет поддержки альфа-канала, эта версия уже входит в PHP 7.3, но на некоторых хостингах она установлена и на более ранних версиях PHP.