如何通过编程检查图像(PNG、JPEG或GIF)是否损坏?

22 投票
5 回答
25310 浏览
提问于 2025-04-15 14:11

好的,我有大约25万张高分辨率的图片。我想做的就是检查这些图片,找出哪些是损坏的。如果你知道4scrape是什么,那你就知道我这些图片的性质。

对我来说,损坏的图片是指在Firefox中打开时,会显示

这张图片“某某图片”无法显示,因为它包含错误。

现在,我可以把这25万张图片(大约150GB)全选,然后拖到Firefox里去打开。但这样做不好,因为我觉得Mozilla并没有设计Firefox来同时打开25万个标签页。不,我需要一种方法来编程检查图片是否损坏。

有没有人知道有没有PHP或Python的库可以做到这一点?或者有没有现成的软件可以在Windows上使用?

我已经删除了明显损坏的图片(比如那些大小为0字节的),但我几乎可以肯定,在我这堆图片中,还有更多损坏的图片。

5 个回答

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,那就说明图片类型不被支持,数据格式不被识别,或者图片损坏,无法加载。

7

我建议你去看看 ImageMagick 这个工具:http://www.imagemagick.org/

里面有一个叫做 identify 的工具,你可以把它和脚本或者标准输出一起使用,或者直接使用它提供的编程接口。

29

一个简单的方法是尝试使用PIL(Python图像库)来加载和验证文件。

from PIL import Image

v_image = Image.open(file)
v_image.verify()

捕获异常...

来自文档的说明:

im.verify()

这个方法尝试检查文件是否损坏,而不实际解码图像数据。如果这个方法发现任何问题,它会抛出相应的异常。这个方法只能在新打开的图像上使用;如果图像已经加载过,结果就不确定了。此外,如果你在使用这个方法后还需要加载图像,你必须重新打开图像文件。

撰写回答