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

N. *_*uda 4 php jpeg corrupt image webp

最近我一直在摆弄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.";
}
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么这个php脚本写入文件系统的webp图像已损坏.为方便起见,我附上了一张测试图片.处理后,其关联的webp图像确实是我系统上的损坏图像.我很感激你对此的意见,因为我不知道为什么这不能正常工作.

图片:http://i.stack.imgur.com/pwZHv.jpg(JPEG)

Ale*_*ard 12

某些版本的libgd忘记在奇数大小的webp文件的末尾添加零填充(这个bug,如前所述).

它可以用PHP修复.替换这个:

imagewebp($im);
Run Code Online (Sandbox Code Playgroud)

有了这个:

ob_start();
imagewebp($im);
if (ob_get_length() % 2 == 1) {
    echo "\0";
}
ob_end_flush();
Run Code Online (Sandbox Code Playgroud)

或者,如果要创建文件而不是直接输出结果:

imagewebp($im, 'test_img.webp');
if (filesize('test_img.webp') % 2 == 1) {
    file_put_contents('test_img.webp', "\0", FILE_APPEND);
}
Run Code Online (Sandbox Code Playgroud)


N. *_*uda 3

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

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