Python用imghdr模块识别图片格式实例解析


Posted in Python onJanuary 11, 2018

imghdr模块

功能描述:imghdr模块用于识别图片的格式。它通过检测文件的前几个字节,从而判断图片的格式。

唯一一个API

imghdr.what(file, h=None)

第一个参数file可以是用rb模式打开的file对象或者表示路径的字符串和PathLike对象。h参数是一段字节串。函数返回表示图片格式的字符串。

>>> import imghdr
>>> imghdr.what('test.jpg')
'jpeg'

具体的返回值和描述如下:

返回值 描述 检测方式
jpeg 用JFIF或者Exif格式保存的JPEG图片 第7到第10个字节是b'JFIF'或者b'Exif'
png 可移植网络图形格式(Portable Network Graphic Format) 以字节串b'\x89PNG\r\n\x1a\n'开头
gif GIF(Graphics Interchange Format)的87版本和89版本 前6个字节为b'GIF87a'或者b'GIF89a'
tiff TIFF(Tag Image File Format)的两种字节顺序 前两个字节为b'MM'或者b'II'
rgb SGI ImgLib 以字节串b'\x01\xda'开头
pbm Portable Bitmap 第1个字节为b'P',第2个字节为b'1'或b'4',第3个字节为b'\t'或b'\n'或b'\r'
pgm Portable Graymap Files 第1个字节为b'P',第2个字节为b'2'或b'5',第3个字节为b'\t'或b'\n'或b'\r'
ppm Portable Pixmap Files 第1个字节为b'P',第2个字节为b'3'或b'6',第3个字节为b'\t'或b'\n'或b'\r'
rast Sun Raster 以字节串b'\x59\xA6\x6A\x95'开头
xbm X Bitmap Files 以字节串b'#define ‘开头
bmp Bitmap,Windows标准图像文件格式 以字节串b'BM'开头
webp 谷歌的WebP格式,Python3.5加入 以字节串b'RIFF'开头并且第9到第12个字节为b'WEBP'
exr OpenEXR,Python3.5加入 以字节串b'\x76\x2f\x31\x01'开头

模块内部缺陷

当h参数不为空时,模块会忽略掉file参数,直接检测h参数,但此时file参数又是必须提供的,算是一个设计缺陷吧。博主个人感觉这个h参数根本没有存在的意义,没必要放在参数列表里面。

>>> import imghdr
>>> imghdr.what('test.jpg', b'\x89PNG\r\n\x1a\n')
'png'
>>>

自定义检测流程

imghdr内部使用了test_jpeg、test_png、test_gif等函数检测文件的格式。模块内部维护了一个函数列表imghdr.tests,每次调用what函数的时候,会按列表里的顺序调用检测函数,当检测函数返回结果时退出循环。用户可以通过修改这个列表达到修改检测流程的目的。同时,也可以自行添加检测函数到列表里面。

下面这个例子,博主添加了一个函数放在检测流程的最后提示文件不是图片:

>>> import imghdr
>>> def final(h, f):
... print("This file isn\'t a image!")
...
>>> imghdr.tests.append(final)
>>> imghdr.what("imghdr.md")
This file isn't a image!

自行添加检测函数需要接收两个参数h和f,h是用来检测的字节串,f是file对象。但是在模块内部自带的检测函数都是没用到这个f参数的…

命令行启动imghdr模块

博主读源码的时候发现了官方文档里面没提到的两个函数,提供了直接用命令行启动imghdr模块的方法。

只需要调用python -m imghdr [-r] file1 file2...就可以直接检测文件的类型。file可以是文件也可以是文件夹。该命令默认只检测文件夹下一层的文件类型,如果需要递归检测,则加上-r参数。

每个文件以”文件名: 文件类型/None”的形式打印一行输出结果。

总结:可能是因为使用的人少的原因,imghdr这个模块内部有挺多小问题,不过只要老老实实按照官方提供的文档使用是不会出事的。博主后面试着改一下这个模块然后pr上去。

以上就是本文关于Python用imghdr模块识别图片格式实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python中的map、reduce和filter浅析
Apr 26 Python
python中from module import * 的一个坑
Jul 20 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
Mar 19 Python
python中的随机函数小结
Jan 27 Python
Python统计单词出现的次数
Apr 04 Python
python绘制圆柱体的方法
Jul 02 Python
对python 合并 累加两个dict的实例详解
Jan 21 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
django foreignkey(外键)的实现
Jul 29 Python
Django文件存储 默认存储系统解析
Aug 02 Python
Python3和pyqt5实现控件数据动态显示方式
Dec 13 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 #Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
Jan 11 #Python
python实现员工管理系统
Jan 11 #Python
Python使用base64模块进行二进制数据编码详解
Jan 11 #Python
Python实现备份MySQL数据库的方法示例
Jan 11 #Python
教你用Python写安卓游戏外挂
Jan 11 #Python
python实现学生管理系统
Jan 11 #Python
You might like
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
浅析PHP Socket技术
2013/08/02 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
JavaScript对象模型-执行模型
2008/04/28 Javascript
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
Linux如何为某个操作添加别名
2015/02/05 面试题
土木工程专业自荐信
2013/10/04 职场文书
追悼会子女答谢词
2014/01/28 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
大学社团计划书
2014/05/01 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
计划生育汇报材料
2014/12/26 职场文书
慈善募捐倡议书
2015/04/27 职场文书
MySQL基础(一)
2021/04/05 MySQL