imghdr 是python标准库中非常短小的一个模块,只有一个功能,就是识别图像的类型,而通过查看imghdr 中的成员,则可看出这个包所能鉴别的图像类型。
>>> dir(imghdr)
[
'test', 'test_bmp', 'test_exr', 'test_gif', 'test_jpeg', 'test_pbm', 'test_pgm', 'test_png', 'test_ppm', 'test_rast', 'test_rgb', 'test_tiff', 'test_webp', 'test_xbm', 'testall', 'tests', 'what']
其中真正有些实用频率的函数也只有一个what ,
>>> imghdr.what('cuda.png')
'png'
按理说这么简单的模块是没有什么讲解价值的,但这个模块是完全用python写的,换句话说,查看其源码,就能知道这些图像的文件头。
例如其鉴别gif 的方法为
def test_gif(h, f):
"""GIF ('87 and '89 variants)"""
if h[:6] in (b'GIF87a', b'GIF89a'):
return 'gif'
也就是说,gif 文件的前六位必然为GIF87a 或者GIF89a ,改为十六进制则为47 49 46 38 37 61 ,由此可知这些图像格式的鉴别方法,在下表中h 为16进制的图像数据
what 值 | 图像格式 | 鉴别方法 |
---|
‘jpeg’ | JFIF格式 Exif格式 | h[6:10]=b'JFIF'
h[6:10]=b'Exif' | ‘png’ | 便携式网络图像 | h[:8]=b'\211PNG\r\n\032\n' | ‘gif’ | GIF87a文件 89a文件 | h[:6]=b'GIF87a'
h[:6]=b'GIF89a' | ‘bmp’ | BMP文件 | h[:2]=b'BM' | ‘tiff’ | TIFF 文件 | h[:2]=b'MM' 或h[:2]=b'II' | ‘rgb’ | SGI图像库文件 | h[:2]=b'\001\332' | ‘webp’ | WebP 文件 | h[:4]='RIFF' 且h[8:12]=b'WEBP' | ‘rast’ | Sun 光栅文件 | h[:4]=b'\x59\xA6\x6A\x95' | ‘exr’ | OpenEXR文件 | h[:4]=b'v/1\x01' | ‘xbm’ | X 位图文件 | h[:8]=b'#define ' |
此外,pbm, pgm, ppm 这三种格式均以b'P' 开头,第三位为b' \t\n\r' 中的一种,区别在于第二位
| 格式 | h[1] |
---|
‘pbm’ | 便携式位图文件 | h[1] in '14' | ‘pgm’ | 便携式灰度图文件 | h[1] in b'25' | ‘ppm’ | 便携式像素表文件 | h[1] in b'36' |
|