最近我一直在摆弄WebP映像格式。我使用PHP 5.5.12,安装了GD库(支持GD 2.1.0/WebP)。我注意到,出于某种原因,PHP创建了损坏的WebP形象。我使用的代码如下:
$im= imagecreatefromjpeg("test_img.jpg");
$succes = imagewebp($im, "test_img.webp");
if ($im !== false && $succes == true) {
echo "Succes.";
}
我无法掌握为什么通过此PHP脚本写入文件系统的WebP映像为何损坏。为了方便起见,我附上了其中一个测试图像。处理后,其关联的WebP映像确实是我系统上的损坏图像。我感谢您对此的意见,因为我不知道为什么这不能正常工作。
图像:https://i.stack.imgur.com/pwzhv.jpg(jpeg)
libgd的某些版本忘记在奇数webp文件的末尾添加零填充(如前所述)。
可以用PHP固定。更换此:
imagewebp($im);
与此:
ob_start();
imagewebp($im);
if (ob_get_length() % 2 == 1) {
echo " ";
}
ob_end_flush();
或或者,如果要创建文件而不是直接输出结果:
imagewebp($im, 'test_img.webp');
if (filesize('test_img.webp') % 2 == 1) {
file_put_contents('test_img.webp', " ", FILE_APPEND);
}
对于你们遇到的与我相同的问题的人,这是一个(此时)打开PHP bugtracker的链接 - 据我所知 - 问题的来源。https://bugs.php.net/bug.php?id=66590
确实,这仍然不是固定的,但我们可以优雅地解决它。对于由 ImageWebp()编写的每个VP8帧,我们需要检查帧长度是否均匀。如果不是这种情况,我们将一个零字节附加到框架末端并继续。更新其标题中定义的框架长度并不相关,因为这已经是正确的长度 - 所需的填充永远不会正确地添加到文件本身中。
我可以将ImageMagick作为替代方案吗?
$im = new Imagick('image.jpg');
$im->writeImage('image.webp');