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只写了一半。
我们将 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只写了一半。