Преобразование webp в jpeg с помощью PHP GD Library - PullRequest
1 голос
/ 07 января 2020

У меня возникли проблемы с созданием чистого транскодирования изображений из webp в jpeg с использованием библиотеки PHP GD. Для справки Вот версия оригинала в формате jpeg с использованием демоверсии Google здесь: https://developers.google.com/speed/webp/gallery (я включаю это в jpeg, так как не могу загрузить webp в stackoverflow )

enter image description here

Сначала я попробовал эту базовую c процедуру:

$image = imagecreatefromwebp('4.webp');
imagejpeg($image, 'converted.jpg', 100);

Этот тип работает, но результат имеет желтый фон, подобный этому: enter image description here

Я также пытался использовать этот бит кода для изменения размера изображений и сначала рисования белого фона:

$image = imagecreatefromwebp('4.webp');
$width = imagesx($image);
$height = imagesy($image);
$new = imagecreatetruecolor($width, $height);
$background = imagecolorallocate($new, 255, 255, 255);
imagefilledrectangle($new, 0, 0, $width, $height, $background);
imagecopyresampled($new, $image, 0, 0, 0, 0, $width, $height, $width, $height);
imagejpeg($new, 'converted.jpg', 100);

Это выглядит еще хуже и приводит к множеству странных артефактов:

enter image description here

Прежде чем я полностью разочаруюсь в GD, кто-нибудь может сделать предложение, чтобы это работало должным образом? Прежде всего, я ищу решение с использованием функций GD. Если это невозможно, я открыт для ImageMagick или другой библиотеки - но я бы хотел немного больше понять, что здесь происходит не так, и можно ли это сделать правильно, не меняя инструменты.

1 Ответ

2 голосов
/ 07 января 2020

Это может быть вызвано известной ошибкой более старой реализации LibGD в PHP: http://git.php.net/?p=php-src.git;a=commit;h=a31fe58d8005ff47f8f6ad095dcd4fb3a2f0aae9

https://bugs.php.net/bug.php?id=70102

Из того, что я вижу, это было исправлено в PHP 7.0.0: https://www.php.net/ChangeLog-7.php (ошибка 70102)

Вторая потенциальная проблема - это libgd itselt. До версии 2.2.0 они использовали libvpx, в 2.2.0 переключились на libwebp.

Я воспроизвел ошибку с PHP 5.6.40 и LibGD 2.1.0. Затем обновил LibGD до 2.2.4 и все работает нормально.

Я предлагаю перейти на более новую версию Ubuntu, но вы также можете извлечь все необходимые библиотеки вручную из https://packages.ubuntu.com/search?keywords=libgd или просто увеличив версию системы в /etc/apt/sources.list, выполнив apt-get update и apt-get upgrade libgd-dev libgd (или libgd2 или libgd3 в зависимости от имени пакета в вашей системе - я пользователь Debian, я не активно следую за пакетами Ubuntu). Скорее всего, она удалит вашу php-gd lib, поэтому обязательно переустановите ее.

...