python标准库通过编码鉴别图像类型
Posted 微小冷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python标准库通过编码鉴别图像类型相关的知识,希望对你有一定的参考价值。
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' |
以上是关于python标准库通过编码鉴别图像类型的主要内容,如果未能解决你的问题,请参考以下文章