ImageWebp(PHP)创建损坏的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.";
}

我无法掌握为什么通过此PHP脚本写入文件系统的WebP映像为何损坏。为了方便起见,我附上了其中一个测试图像。处理后,其关联的WebP映像确实是我系统上的损坏图像。我感谢您对此的意见,因为我不知道为什么这不能正常工作。

图像:https://i.stack.imgur.com/pwzhv.jpg(jpeg)

libgd的某些版本忘记在奇数webp文件的末尾添加零填充(如前所述)。

可以用PHP固定。更换此:

imagewebp($im);

与此:

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

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

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

对于你们遇到的与我相同的问题的人,这是一个(此时)打开PHP bugtracker的链接 - 据我所知 - 问题的来源。https://bugs.php.net/bug.php?id=66590

确实,这仍然不是固定的,但我们可以优雅地解决它。对于由 ImageWebp()编写的每个VP8帧,我们需要检查帧长度是否均匀。如果不是这种情况,我们将一个零字节附加到框架末端并继续。更新其标题中定义的框架长度并不相关,因为这已经是正确的长度 - 所需的填充永远不会正确地添加到文件本身中。

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

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

相关内容

  • 没有找到相关文章

最新更新