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

Joe*_*gen 17 php python image

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

对我来说,损坏的是图像被加载到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%确定在我的一个集合中有更多的病变图像浮动.

Chr*_*heD 23

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

from PIL import Image

v_image = Image.open(file)
v_image.verify()
Run Code Online (Sandbox Code Playgroud)

赶上例外......

文档:

im.verify()

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

  • 这个解决方案很简单,我把它包装在Python脚本周围,以递归方式检查损坏的文件.我在这里发帖,希望能帮助其他人:http://bitbucket.org/denilsonsa/small_scripts/src (2认同)
  • `verify()` 方法不适用于所有 img 格式。被截断的 JPG 文件(和一些其他格式)仍然可以“通过”`verify()` 和 `open()` 而不会引发异常。如果你真的想涵盖所有内容,你可以尝试 `show()` 甚至更好:`load()`。如果失败,这些将引发异常,主要是`OSError`。 (2认同)
  • @maviz 我一直在研究一个小的通用检查脚本(它是从一些 Python 中产生的,用于将 `os.walk` 粘合到 `unzip -t` 和 `unrar t`),我可以告诉你,`Image. load()` 不会捕获所有 JPEG 错误。事实上,我找到的所有解决方案(即使是特定于 JPEG 的解决方案)都无法捕捉到其他人在 https://superuser.com/q/276154/48014 上发布的示例,因此我可能需要研究一下绿色条纹是纯色的,足以通过编程识别为“不是 JPEG 应该产生的”。 (2认同)

Nik*_*iko 6

我建议你看看imagemagick:http://www.imagemagick.org/

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


Ali*_*xel 5

在PHP中,使用exif_imagetype():

if (exif_imagetype($filename) === false)
{
    unlink($filename); // image is corrupted
}
Run Code Online (Sandbox Code Playgroud)

编辑:或者您可以尝试使用ImageCreateFromString()完全加载图像:

if (ImageCreateFromString(file_get_contents($filename)) === false)
{
    unlink($filename); // image is corrupted
}
Run Code Online (Sandbox Code Playgroud)

成功返回图像资源.如果图像类型不受支持,数据不是可识别的格式,或者图像已损坏且无法加载,则返回FALSE.