我有来自网络摄像头流的> 2000张图片(对于延时视频),我需要删除所有不完整的&损坏的图像,然后将它们传递给编辑最终视频的php-gd脚本。
是否可以使用imagemagick或其他工具检测损坏的文件?如果我尝试用feh打开损坏的图像,它会在控制台中显示libpng error: Read Error
提前致谢!
更新:在我的情况下,建议的识别方法似乎接受了错误的图像。以下是损坏的http://imgur.com/YcB9n
的示例答案 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()
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