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标准库通过编码鉴别图像类型的主要内容,如果未能解决你的问题,请参考以下文章

Python 标准库之 json 编码和解码器『详解』

通过Azure 存储账号URL鉴别是标准磁盘还是高性能磁盘

在python 3.6中处理自定义编码时遇到类型错误

python图像处理库 哪个好 知乎

Python 标准库第三方库

python有关改变标准输出的默认编码的问题