最近,我一直在摆弄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图像确实是我系统上的损坏图像。我很感激您对此的意见,因为我不知道为什么这样做不正常。
图片:http://i.stack.imgur.com/pwZHv.jpg(JPEG)
答案 0 :(得分:10)
某些版本的libgd忘记在奇数大小的webp文件末尾添加零填充(this bug,如前所述)。
可以用PHP修复。替换这个:
imagewebp($im);
有了这个:
ob_start();
imagewebp($im);
if (ob_get_length() % 2 == 1) {
echo "\0";
}
ob_end_flush();
或者,如果您想创建一个文件而不是直接输出结果:
imagewebp($im, 'test_img.webp');
if (filesize('test_img.webp') % 2 == 1) {
file_put_contents('test_img.webp', "\0", FILE_APPEND);
}
答案 1 :(得分:2)
对于那些遇到与我一样的问题的人来说,这里有一个(此时)开放的PHP bugtracker的链接 - 据我所知 - 是问题的根源。 https://bugs.php.net/bug.php?id=66590
确实令人遗憾的是,这仍然没有修复,但我们可以自己相当优雅地解决它。对于 imagewebp()编写的每个VP8帧,我们需要检查帧长度是否均匀。如果不是这种情况,我们将一个零字节附加到帧的末尾并继续。更新其标头中定义的帧长度是不相关的,因为它已经具有适当的长度 - 必要的填充从未正确添加到文件本身。
答案 2 :(得分:0)
我可以提议将ImageMagick作为替代方案吗?
$im = new Imagick('image.jpg');
$im->writeImage('image.webp');