ImageMagick/GraphicsMagick/libvips图像随机损坏



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

我们已经尝试了不同的软件,如GraphicsMagick或VIPS,但问题仍然存在。这似乎也只有在有并行过程的情况下才会发生。因此,整个脚本是通过sempahores锁定的,但这对也没有帮助

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

我们还想知道,为什么所有这些软件都有同样的行为。我们还尝试了不同的PHP版本。这种情况似乎更多地发生在具有巨大维度/文件大小的源映像上。

知道在这里做什么吗?

实施例1实施例2实施例3

我猜源图像由于某种原因被截断了。也许下载过程中出现了超时?

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 = VipsImage::thumbnail('truncated.jpg[fail]', 128);

现在没有输出,并且有一个错误代码。我确信有一个类似的imagemagik,尽管我不知道。

有一个缺点:如果图像有任何问题,拇指钉现在就会失败,而且可能是你不在乎的事情,比如分辨率无效。

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

最新更新