【问题标题】:ImageMagick / GraphicsMagick / libvips Images randomly corruptedImageMagick / GraphicsMagick / libvips 图像随机损坏
【发布时间】:2021-07-23 08:38:54
【问题描述】:

我们正在使用 ImageMagick 将 JPG 调整大小/缩略图到特定大小。源文件通过 HTTP 加载。它按预期工作,但有时有些图像会部分损坏。

我们已经尝试过不同的软件,例如 GraphicsMagick 或 VIPS,但问题仍然存在。它似乎也只有在有并行进程的情况下才会发生。所以整个脚本是通过信号量锁定的,但也无济于事

我们发现了多个类似的问题,但都没有任何解决方案:https://legacy.imagemagick.org/discourse-server/viewtopic.php?t=22506

我们还想知道,为什么所有这些软件的行为都是一样的。我们还尝试了不同的 PHP 版本。它似乎更常发生在具有巨大尺寸/文件大小的源图像上。

知道在这里做什么吗?

Example 1Example 2Example 3

【问题讨论】:

  • 这可以帮助您检测输入图像是否不完整/被截断...stackoverflow.com/a/68415308/2836621
  • 如果 ImageMagickGraphicsMagicklibvips 出现问题,我们必须假设问题出在您的代码或输入中图像 - 我们都看不到。因此,除了使用我上面的建议检查您的图像之外,很难提供帮助。
  • 可能 /tmp 被填满了。

标签: php imagemagick graphicsmagick vips


【解决方案1】:

我猜源图像由于某种原因被截断了。可能是在下载过程中发生了超时?

libvips 通常是允许的,这意味着它会尝试为您提供一些东西,即使输入已损坏。您可以使用 fail 标志使其严格(即第一次警告失败)。

例如:

$ head -c 10000 shark.jpg > truncated.jpg
$ vipsthumbnail truncated.jpg
(vipsthumbnail:9391): VIPS-WARNING **: 11:24:50.439: read gave 2 warnings
(vipsthumbnail:9391): VIPS-WARNING **: 11:24:50.439: VipsJpeg: Premature end of JPEG file
$ echo $?
0

我制作了一个截断的 jpg 文件,然后运行缩略图。它发出警告,但没有失败。如果我跑:

$ vipsthumbnail truncated.jpg[fail]
VipsJpeg: Premature end of input file
$ echo $?
1

或者在php中:

$thumb = Vips\Image::thumbnail('truncated.jpg[fail]', 128);

现在没有输出,并且有一个错误代码。我确定有一个 imagemagick 等价物,虽然我不知道。

有一个缺点:如果图像有任何问题,缩略图现在将失败,这可能是您不关心的事情,例如无效的分辨率。

【讨论】:

  • IIRC identify -verbose 是 ImageMagick 检查它是否已损坏的方法:stackoverflow.com/a/39304913/322020
  • 感谢您的反馈。但是添加 ['fail' => true] 会导致该标志未知的异常。
  • 哎呀,很抱歉,我修好了。
【解决方案2】:

经过一些额外的调查,我们发现源图像确实已经损坏。它是通过不够稳定的 vpn 连接下载的。有时下载会停止,所以 JPG 只写了一半。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多