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

时间:2011-01-24 09:30:44

标签: bash image-processing png

我有来自网络摄像头流的> 2000张图片(对于延时视频),我需要删除所有不完整的&损坏的图像,然后将它们传递给编辑最终视频的php-gd脚本。

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

提前致谢!

更新:在我的情况下,建议的识别方法似乎接受了错误的图像。以下是损坏的http://imgur.com/YcB9n

的示例

3 个答案:

答案 0 :(得分:17)

尝试使用ImageMagick的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()

来自documentation

  

im.verify()

     

尝试确定文件是否为   破碎,没有实际解码   图像数据。如果此方法找到任何   问题,它提出了合适的   例外。此方法仅适用于   一个新打开的图像;如果图像有   已加载,结果是   未定义。此外,如果您需要加载   使用此方法后的图像,你   必须重新打开图像文件。

答案 1 :(得分:7)

本发明提供

identify -ping IMAGE_NAME

对于损坏的图像具有非零返回码,您可以这样做:

RESULTS_FILE=/tmp/failed_images
find . -name \*.png -exec identify -ping {} \; -or -exec echo {} \; > $RESULTS_FILE

这会将失败图像列表设为$RESULTS_FILE。例如,检查它,将文件中的结果数与图像数进行比较:

find . -name \*.png | wc -l
wc -l $RESULTS_FILE

当您感到满意时,请通过

删除图片
cat $RESULTS_FILE | xargs rm -f

答案 2 :(得分:6)

我在jpg上尝试了ImageMagick identify命令,我已经抛出了几种腐败。它能够识别一些,但不是全部,所以这可能只是部分解决方案,但试试这个:

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