Изображения 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.07.2019, обновлено 30.08.2019 357

Поделится

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

Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
В статье представлены все самые встречающеюся мета-теги с примерами и пояснениями их использования.
Обзор html мата-тегов для браузеров Safari на платформах Mac OS X и iOS.
Мета-теги в head страницы, которые влияют на работу и функции Internet Explorer, Edge и Windows.
В интернет магазинах, CRM и других сервисах для «правильности» есть необходимость склонять существительных после чисел...
Селект с множественным выбором (select multiple) весьма не удобен, при выборе часто забываешь нажимать сtrl и все...