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)

4

3 回答 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);
}
于 2016-01-25T16:36:56.803 回答
3

对于那些遇到与我相同的问题的人,这里是一个(目前)开放的 PHP bugtracker 的链接,据我所知,它是问题的根源。https://bugs.php.net/bug.php?id=66590

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

于 2015-05-08T13:24:07.257 回答
0

我可以建议 ImageMagick 作为替代方案吗?

   $im = new Imagick('image.jpg');
   $im->writeImage('image.webp');
于 2015-08-26T08:21:24.140 回答