imagewebp (php) 创建损坏的 webp 文件

imagewebp (php) creates corrupted webp files

最近在摸索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)

对于那些 运行 和我遇到同样问题的人,这里有一个 link 到(此时)打开的 PHP bugtracker - 据我所知- 问题的根源。 https://bugs.php.net/bug.php?id=66590

遗憾的是,这仍然没有解决,但我们可以自己优雅地解决它。对于imagewebp()写入的每个VP8帧,我们需要检查帧长度是否偶数。如果不是这种情况,我们将一个零字节附加到帧的末尾并继续。更新其 header 中定义的帧长度无关紧要,因为这已经是适当的长度 - 必要的填充从未正确添加到文件本身。

我可以推荐 ImageMagick 作为替代方案吗?

   $im = new Imagick('image.jpg');
   $im->writeImage('image.webp');

某些版本的 libgd 忘记在 odd-sized webp 文件的末尾添加零填充(this bug,如前所述)。

可以用PHP修复。替换为:

imagewebp($im);

有了这个:

ob_start();
imagewebp($im);
if (ob_get_length() % 2 == 1) {
    echo "[=11=]";
}
ob_end_flush();

或者,如果您想创建一个文件而不是直接输出结果:

imagewebp($im, 'test_img.webp');
if (filesize('test_img.webp') % 2 == 1) {
    file_put_contents('test_img.webp', "[=12=]", FILE_APPEND);
}