代码之家  ›  专栏  ›  技术社区  ›  Sujoy

如何检查文件是否为有效的图像文件?

  •  75
  • Sujoy  · 技术社区  · 15 年前

    我目前正在使用PIL。

    from PIL import Image
    try:
        im=Image.open(filename)
        # do stuff
    except IOError:
        # filename not an image file
    

    然而,虽然这足以涵盖大多数情况,但一些图像文件(如xcf、svg和psd)未被检测到。Psd文件引发溢出错误异常。

    有没有什么方法可以把它们也包括进去?

    8 回复  |  直到 7 年前
        1
  •  232
  •   Nadia Alramli    15 年前

    我刚刚找到了那辆车 imghdr 单元来自python文档:

    imghdr模块确定类型 指包含在文件或字节中的图像 流动

    这就是它的工作原理:

    >>> import imghdr
    >>> imghdr.what('/tmp/bass')
    'gif'
    

    使用模块比重新实现类似功能要好得多

        2
  •  51
  •   Two-Bit Alchemist    10 年前

    verify 方法检查文件是否已损坏。

    im.verify()

    尝试确定该文件是否正确 坏了,没有真正解码 图像数据。如果此方法找到任何 问题,它提出了合适的解决方案 例外情况。此方法仅适用于 已加载,结果为 未定义。另外,如果您需要加载 必须重新打开图像文件。属性

        3
  •  17
  •   Brian R. Bondy    15 年前

    很多时候,前几个字符对于各种文件格式来说都是一个神奇的数字。除了上面的异常检查之外,您还可以检查这个。

        4
  •  17
  •   tsveti_iko    5 年前

    除了 PIL 图像检查您还可以添加文件扩展名检查,如下所示:

    filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))
    

    请注意,这只检查文件名是否具有有效的图像扩展名,实际上它不会打开图像以查看它是否是有效的图像,这就是为什么需要另外使用 皮尔 或者其他答案中建议的图书馆之一。

        5
  •  8
  •   Fabiano Tarlao    6 年前

    使现代化

    我还在Python脚本中实现了以下解决方案 here on GitHub

    我还验证了受损文件(jpg)通常不是“损坏”的图像,即受损的图片文件有时仍然是合法的图片文件,原始图像丢失或更改,但您仍然能够加载它而没有错误。但是,文件截断总是会导致错误。

    您可以使用Python 枕头 (PIL)模块,具有大多数图像格式,用于检查文件是否为有效且完整的图像文件。

    在这种情况下,你的目标也是检测破碎的图像,@Nadia Alramli正确地建议 im.verify() 方法,但这个 未检测到所有可能的图像缺陷 ,例如:。, im.verify

    枕头 也能够检测这些类型的缺陷,但您必须应用图像处理或图像解码/重新编码或触发检查。最后,我建议使用以下代码:

    try:
      im = Image.load(filename)
      im.verify() #I perform also verify, don't know if he sees other types o defects
      im.close() #reload is necessary in my case
      im = Image.load(filename) 
      im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
      im.close()
    except: 
      #manage excetions here
    

    如果出现图像缺陷,此代码将引发异常。 使用此代码,您将使用标准Pillow以大约10 MBytes/s的速度验证一组映像,或者使用Pillow SIMD模块(现代2.5Ghz x86_64 CPU)以大约40 MBytes/s的速度验证一组映像。

    对于其他格式 屏蔽门 , Imagemagick 包装纸 ,代码如下:

    im = wand.image.Image(filename=filename)
    temp = im.flip;
    im.close()
    

    但是,根据我的实验,魔杖并没有检测到被截短的图像,我认为它在没有提示的情况下将缺少的部分加载为灰色区域。

    Imagemagick 有一个外部命令 那个 完成该任务,但我还没有找到一种以编程方式调用该函数的方法,而且我也没有测试此路由。

    我建议始终进行初步检查,检查 文件大小 不为零(或非常小),是一个非常重要的问题 花钱少的

    statfile = os.stat(filename)
    filesize = statfile.st_size
    if filesize == 0:
      #manage here the 'faulty image' case
    
        6
  •  8
  •   Alex Fortin    3 年前

    一种选择是使用 filetype 包裹

    安装

    python -m pip install filetype

    1. Fast:只加载图像的前几个字节就可以了( 查一下这个神奇的数字
    2. 支持不同的mime类型:图像、视频、字体、音频、存档。

    import filetype
    
    filename = "/path/to/file.jpg"
    
    if filetype.is_image(filename):
        print(f"{filename} is a valid image...")
    elif filetype.is_video(filename):
        print(f"{filename} is a valid video...")
    

    文件类型<=1.0.6

    import filetype
    
    filename = "/path/to/file.jpg"
    
    if filetype.image(filename):
        print(f"{filename} is a valid image...")
    elif filetype.video(filename):
        print(f"{filename} is a valid video...")
    

    https://github.com/h2non/filetype.py

        7
  •  7
  •   Ham    3 年前

    在Linux上,您可以使用 python-magic 哪个使用 libmagic 识别文件格式。

    好的,libmagic会查看文件并尝试告诉您更多关于它的信息,而不仅仅是格式,如位图尺寸、格式版本等。。所以你可能会认为这是对“有效性”的肤浅测试。

    对于“valid”的其他定义,您可能必须编写自己的测试。

        8
  •  6
  •   Kamil Kisiel    15 年前

    您可以使用Python绑定到libmagic, python-magic 然后检查mime类型。这不会告诉您文件是否损坏或完整,但它应该能够确定它是什么类型的图像。

        9
  •  -1
  •   rObinradOO    4 年前
    format = [".jpg",".png",".jpeg"]
     for (path,dirs,files) in os.walk(path):
         for file in files:
             if file.endswith(tuple(format)):
                 print(path)
                 print ("Valid",file)
             else:
                 print(path)
                 print("InValid",file)