ImageMagick / GraphicsMagick / libvips 图像随机损坏

ImageMagick / GraphicsMagick / libvips Images randomly corrupted

我们将 ImageMagick 用于 resizing/thumbnailing 特定尺寸的 JPG。源文件通过 HTTP 加载。它按预期工作,但有时某些图像会部分损坏。

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

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

我们也想知道,为什么在所有这些软件中都是相同的行为。我们还尝试了不同的 PHP 版本。它似乎更常发生在具有巨大 dimension/filesize.

的源图像上

知道这里要做什么吗?

Example 1 Example 2 Example 3

我猜源图像由于某种原因被 t运行 处理过。也许下载过程中出现超时?

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

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

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

或在php中:

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

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

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

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