如何以编程方式检查图像(PNG,JPEG或GIF)是否已损坏?

时间:2009-09-09 19:15:41

标签: php python image

好。所以我有大约250,000张高分辨率图像。我想要做的是仔细检查所有这些并找到损坏的。如果您知道4scrape是什么,那么您就知道图像的本质。

对我来说,损坏的是图片被加载到Firefox中,它说

  

The image “such and such image” cannot be displayed, because it contains errors.

现在,我可以选择所有250,000张图像(~150gb)并将它们拖放到Firefox中。那会很糟糕,因为我不认为Mozilla设计Firefox可以打开250,000个标签。不,我需要一种方法来以编程方式检查图像是否已损坏。

有没有人知道可以在这些方面做某事的PHP或Python库?或者现有的Windows软件?

我已经删除了明显已损坏的图像(例如0字节的图片),但我大约99.9%确定在我的人群中有更多患病的图像浮动。

5 个答案:

答案 0 :(得分:23)

一种简单的方法是尝试使用PIL(Python Imaging Library)加载和验证文件。

from PIL import Image

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

抓住例外......

来自the documentation

<强> im.verify()

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

答案 1 :(得分:6)

我建议您查看imagemagick:http://www.imagemagick.org/

你有一个名为identify的工具,你可以将它与脚本/标准输出结合使用,或者你可以使用提供的编程接口

答案 2 :(得分: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   图像类型不受支持,数据是   不是公认的格式,或   图片已损坏且无法加载。

答案 3 :(得分:3)

如果您的确切要求是在FireFox 中正确显示,那么您可能会遇到困难时间 - 唯一可以确定的方法是链接到与FireFox完全相同的图像加载源代码。< / p>

只需尝试使用任意数量的图像库打开文件,即可检测到基本图像损坏(文件不完整)。

然而,许多图像无法显示,因为它们会拉伸您正在使用的特定查看器无法处理的文件格式的一部分(特别是GIF有很多这些边缘情况,但您可以找到JPEG和罕见的PNG文件,只能在特定的查看器中显示)。还有一些丑陋的JPEG边缘情况,文件出现在查看器X中没有损坏,但实际上文件已被缩短并且只能正确显示,因为很少有信息丢失(FireFox可以显示一些正确的JPEG切断[你得到一个灰色的底部],但其他导致FireFox看起来加载他们的一半,然后显示错误信息而不是部分图像)

答案 4 :(得分:0)

如果可用,您可以使用imagemagick:

如果你想做一个整个文件夹

identify "./myfolder/*" >log.txt 2>&1

如果您只想查看文件:

identify myfile.jpg