在Bash脚本中检测损坏的图像

27

我有一段摄像头视频流记录的超过2000张图片(用于制作时间轴视频),我需要删除所有不完整或损坏的图片,然后将其传递给一个php-gd脚本以编辑它们用于最终视频。

是否可能使用imagemagick或其他工具检测损坏的文件?如果我尝试使用feh打开损坏的图像,控制台显示“libpng error:Read Error”

谢谢!

更新:似乎建议使用identify方法在我的情况下可以接受糟糕的图像。这是一个损坏的示例http://imgur.com/YcB9n


这里与“identify”相同的问题。它接受实际上是不完整的图像。 - Vicky Chijwani
1
将此问题标记为“过于宽泛”是否意味着选民的狭隘思维?在我看来,这是一个完全合适的问题。 - mitchus
1
默认情况下,“identify”仅查看图像头,因此无法检测图像数据中的损坏。请使用“identify -verbose”扫描整个图像文件。 - Glenn Randers-Pehrson
这可能是[su]上一个好问题,但不适合在这里提问,因为它没有涉及编程,甚至也没有要求。 - jpaugh
2个回答

33

尝试使用ImageMagick的identify命令。从它的man页面可以看到:

Identify描述了一个或多个图像文件的格式和特性。如果图像不完整或损坏,它也会报告。

示例:

$ identify foo.png
identify: NotAPNGImageFile (foo.png).

$ echo $?
1

另一种选择是使用 PIL (Python Imaging Library)

from PIL import Image

im = Image.open("foo.png")
im.verify()

文档中获取:

im.verify()

尝试确定文件是否损坏,而不实际解码图像数据。 如果此方法发现任何问题,则引发适当的异常。 此方法仅适用于新打开的图像; 如果图像已经被加载,则结果未定义。 另外,如果您需要在使用此方法后加载图像,则必须重新打开图像文件。


1
喜欢 identify 命令行。非常感谢!你救了我的屁股! - Atcold
3
我可以确认,正如原帖所报告的那样,“identify”工具通常也会接受明显不完整的图像。 - Vicky Chijwani
2
请使用“-verbose”标志输出错误和警告。 - Orhan

11

我尝试对一个包含多种损坏的jpg文件运行ImageMagick的identify命令。它能够识别一些,但不是全部,所以这可能只是一个部分解决方案而已,但您可以尝试以下方法:

for f in *.JPG ; do identify $f > /dev/null || echo $f >> /tmp/fail ; done ; cat /tmp/fail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接