ImageMagick验证图像完整性

时间:2013-07-19 23:45:59

标签: imagemagick imagemagick-convert wand

我正在使用ImageMagick(使用Python中的Wand)来转换图像并从中获取缩略图。但是,我注意到我需要提前验证文件是否是图像。我应该用识别吗?

所以我假设检查文件的完整性需要将整个文件读入内存。尝试转换文件是更好的,如果有错误,那么我们知道文件不好。

5 个答案:

答案 0 :(得分:7)

好像你回答了自己的问题

$ ls -l *.png
-rw-r--r-- 1 jsp jsp 526254 Jul 20 12:10 image.png
-rw-r--r-- 1 jsp jsp  10000 Jul 20 12:12 image_with_error.png
$ identify image.png &> /dev/null; echo $?
0
$ identify image_with_error.png &> /dev/null; echo $?
0
$ convert image.png /dev/null &> /dev/null ; echo $?
0
$ convert image_with_error.png /dev/null &> /dev/null ; echo $?
1

答案 1 :(得分:1)

这是另一个使用识别的解决方案,但没有转换:

identify -verbose *.png 2>&1 | grep "corrupt image"

identify: corrupt image 'image_with_error.png' @ error/png.c/ReadPNGImage/4051.

答案 2 :(得分:1)

在使用Python的情况下,您还可以考虑使用Pillow模块。

在我的实验中,我同时使用了Pyhton枕头模块(PIL)和Imagemagick包装棒(用于psd,xcf格式)来检测损坏的图像,带有代码段的原始答案是here

更新: 我也在我的Python脚本here on GitHub中实现了该解决方案。

我还验证了损坏的文件(jpg)经常不是“损坏”的图像,即,损坏的图片文件有时仍是合法的图片文件,原始图像丢失或更改了,但您仍然可以加载它。 结束更新

为完整起见,我引用了完整答案:

您可以使用具有大多数图像格式的Python Pillow (PIL)模块来检查文件是否为有效且完整的图像文件。

如果您还打算检测损坏的图像,则@Nadia Alramli正确建议使用im.verify()方法,但是此不能检测所有可能的图像缺陷,例如{{1 }}不能检测到截断的图像(大多数观看者通常会在其灰色区域加载该图像)。

枕头也能够检测到此类缺陷,但是您必须在其中应用图像处理或图像解码/重新编码或触发检查。最后,我建议使用以下代码:

im.verify

在图像缺陷的情况下,此代码将引发异常。 请考虑im.verify大约比执行图像处理快100倍(我认为翻转是更便宜的转换之一)。 使用此代码,您将以大约10 MBytes / sec的速度验证一组图像(使用现代2.5Ghz x86_64 CPU的单线程)。

对于其他格式 psd xcf ,..,您可以使用 Imagemagick 包装器 Wand ,代码如下:

try:
  im = Image.load(filename)
  im.verify() #I perform also verify, don't know if he sees other types o defects
  im.close() #reload is necessary in my case
  im = Image.load(filename) 
  im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
  im.close()
except: 
  #manage excetions here

但是,根据我的实验,Wand无法检测到截断的图像,我认为它会在没有提示的情况下将缺少的部分加载为灰色区域。

我认为 Imagemagick 具有一个外部命令 identify ,该命令可以完成任务,但是我还没有找到调用该功能的方法以编程方式,我尚未测试此路线。

我建议始终执行初步检查,检查 filesize 不为零(或很小),这是一个非常便宜的主意:

im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()

答案 3 :(得分:0)

如果您使用 imagemagick identify 工具指定 regard-warnings 标志

magick identify -regard-warnings myimage.jpg

如果有关于文件的任何警告,它会抛出一个错误。这对检查图像很有用,而且似乎比使用 verbose 快很多。

答案 4 :(得分:-2)

我使用识别:

$ identify image.tif
00000005.tif TIFF 4741x6981 4741x6981+0+0 8-bit DirectClass 4.471MB 0.000u 0:00.010
$ echo $?