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

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);
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

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

1. Баг c цветами

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

Оригинальное изображение Webp
Оригинал
В функции imageCreatefromWebp есть ошибка из-за которой изображение теряет синий канал
Результат

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

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

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);
}
PHP

3. Теряется прозрачность при сохранении PNG в WEBP

До версии библиотеки GD 2.2.5 у WEBP нет поддержки альфа-канала, эта версия уже входит в PHP 7.3, но на некоторых хостингах она установлена и на более ранних версиях PHP.

Оригинал PNG
Оригинал PNG
Результат PNG в WEBP с потерей прозрачности
Результат WEBP
07.07.2019, обновлено 18.09.2020
13745

Комментарии

, чтобы добавить комментарий.

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

Мануал по созданию и форматированию excel файлов в PHPExcel
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
84455
+24
Список MIME типов
Ниже приведён список MIME-заголовков и расширений файлов.
12331
+4
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
18267
+7
Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
51053
+19
Работа с JSON в PHP
JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и...
72502
+11
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
45101
+29