Python 内置模块判断图像真类型

你的眼睛可真好看,里面有晴雨,日月,山川,江河,云雾,花鸟,但我的眼睛更好看,因为我的眼里有你。

——余光中

我们知道文件的后缀名称可以根据需要随时更改,更改后缀名的图像在各个系统下也大多可以正确查看。但在进行数据集构建的时候不同类型的图片对应不同库中不同的方法,此时,得到文件的真实类型十分重要。

所幸,Python 设计之初就提供了内置的模块Lib/imghdr.py来帮助我们完成这项事情。

imghdr 模块推测文件或字节流中的图像的类型。模块十分简洁,仅包含了如下两个函数:

  1. imghdr.what(filename, h=None)

    测试包含在命名为 filename 的文件中的图像数据,并且返回描述此类图片的字符串。如果可选的 h 被提供, filename 将被忽略并且 h 包含将被测试的二进制流。返回值来自 what(),以下图像类型是可识别的:

    图像格式
    ‘rgb’ SGI 图像库文件
    ‘gif’ GIF 87a 和 89a 文件
    ‘pbm’ 便携式位图文件
    ‘pgm’ 便携式灰度图文件
    ‘ppm’ 便携式像素表文件
    ‘tiff’ TIFF 文件
    ‘rast’ Sun 光栅文件
    ‘xbm’ X 位图文件
    ‘jpeg’ JFIF 或 Exif 格式的 JPEG 数据
    ‘bmp’ BMP 文件
    ‘png’ 便携式网络图像
    ‘webp’ WebP 文件
    ‘exr’ OpenEXR 文件
    • 在 3.5 版更改: exr 和 webp 格式被添加
    • 在 3.6 版更改: 接受一个 path-like object
  2. imghdr.tests()

    执行单个测试的函数列表。每个函数都有两个参数:字节流和类似开放文件的对象。当 what() 用字节流调用时,类文件对象将是 None。

    如果测试成功,这个测试函数应当返回一个描述图像类型的字符串,否则返回 None。

Reference

  1. imghdr — Determine the type of an image