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

6

最近我一直在研究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)
3个回答

15

部分版本的libgd在奇数大小的webp文件末尾忘记添加零填充(如已经提到的此错误)。

可以使用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);
}

这个修复是否适用于当我将文件转换为webp格式时,输出只是一个空白透明图像,而不是损坏的图像? - Jed
我也遇到过一个透明图像,但是尺寸是正确的,即使我已经应用了补丁。我非常有兴趣了解在哪些情况下会发生这种情况。它将用于一个PHP库,用于使用多种方法转换webp图像。GitHub页面:https://github.com/rosell-dk/webp-convert - rosell.dk
1
有人经验过,使用您发布的版本创建文件时,webp 的大小不正常。我猜这意味着 file_put_contents 失败了。这可能是因为在第一次写入后很快再次写入同一文件存在问题吗?它不能是权限问题,因为文件已经被成功创建了。该问题在此处报告:(https://wordpress.org/support/topic/images-not-seen-on-chrome/#post-11390284) - rosell.dk

3
如果你遇到了和我一样的问题,这里有一个链接(目前)可以访问的PHP bug追踪器,据我所知,这是问题的源头。https://bugs.php.net/bug.php?id=66590 很遗憾,这个问题仍然没有被解决,但我们可以自己相当优雅地解决它。对于由imagewebp()编写的每个VP8帧,我们需要检查帧长度是否为偶数。如果不是这种情况,我们将在帧末尾添加一个零字节并继续。更新其标题中定义的帧长度并不重要,因为这已经是正确的长度 - 所需的填充只是从未正确添加到文件本身中。

0

我可以提议使用ImageMagick作为替代方案吗?

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

这个只在ImageMagick有访问webp库的情况下才能工作。如果是这种情况,ImageMagick是一个很好的库可以使用。如果没有,你将不得不使用一种解决办法。你会在$im->writeImage('image.webp');上遇到PHP错误。 - Nelewout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接