如何通过编程检查图像(PNG、JPEG或GIF)是否损坏?
好的,我有大约25万张高分辨率的图片。我想做的就是检查这些图片,找出哪些是损坏的。如果你知道4scrape是什么,那你就知道我这些图片的性质。
对我来说,损坏的图片是指在Firefox中打开时,会显示
这张图片“某某图片”无法显示,因为它包含错误。
现在,我可以把这25万张图片(大约150GB)全选,然后拖到Firefox里去打开。但这样做不好,因为我觉得Mozilla并没有设计Firefox来同时打开25万个标签页。不,我需要一种方法来编程检查图片是否损坏。
有没有人知道有没有PHP或Python的库可以做到这一点?或者有没有现成的软件可以在Windows上使用?
我已经删除了明显损坏的图片(比如那些大小为0字节的),但我几乎可以肯定,在我这堆图片中,还有更多损坏的图片。
5 个回答
在PHP中,你可以使用 exif_imagetype() 这个函数来判断图片的类型:
if (exif_imagetype($filename) === false)
{
unlink($filename); // image is corrupted
}
补充说明: 你也可以尝试用 ImageCreateFromString() 来完全加载图片:
if (ImageCreateFromString(file_get_contents($filename)) === false)
{
unlink($filename); // image is corrupted
}
如果成功的话,会返回一个图片资源。如果返回FALSE,那就说明图片类型不被支持,数据格式不被识别,或者图片损坏,无法加载。
我建议你去看看 ImageMagick 这个工具:http://www.imagemagick.org/
里面有一个叫做 identify 的工具,你可以把它和脚本或者标准输出一起使用,或者直接使用它提供的编程接口。
一个简单的方法是尝试使用PIL(Python图像库)来加载和验证文件。
from PIL import Image
v_image = Image.open(file)
v_image.verify()
捕获异常...
来自文档的说明:
im.verify()
这个方法尝试检查文件是否损坏,而不实际解码图像数据。如果这个方法发现任何问题,它会抛出相应的异常。这个方法只能在新打开的图像上使用;如果图像已经加载过,结果就不确定了。此外,如果你在使用这个方法后还需要加载图像,你必须重新打开图像文件。