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

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基础之getpass模块详细介绍
  • Python用sndhdr模块识别音频格式详解
  • Python使用base64模块进行二进制数据编码详解
  • 简单了解python模块概念
  • Python编程pygame模块实现移动的小车示例代码
  • python的numpy模块安装不成功简单解决方法总结
  • python Crypto模块的安装与使用方法
  • Python内置模块turtle绘图详解
  • Python中getpass模块无回显输入源码解析
时间: 2018-01-10

Python使用base64模块进行二进制数据编码详解

前言 昨天团队的学妹来问关于POP3协议的问题,所以今天稍稍研究了下POP3协议的格式和Python里面的poplib.而POP服务器往回传的数据里有一部分需要用到Base64进行解码,所以就顺便看了下Python里面的base64模块. 本篇先讲一下base64模块,该模块提供了关于Base16,Base32,Base64,Base85和Ascii85的编码和解码相关的函数.有关poplib模块的内容,会在后面发上来.嗯,又挖了一个坑,这辈子挖的坑填不完了... 以下内容摘自http://bb

Python内置模块turtle绘图详解

urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形. turtle绘图的基础知识: 1.画布(canvas) 画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置. 设置画布大小 turtle.screensize(canvwidth=None,canvheight=None,bg=None),参数分别为画布的

python的numpy模块安装不成功简单解决方法总结

为了画个图,被numpy这个模块的安装真的折腾疯了!!!一直装不上,花了几个小时,看了网上的很多教程.方法发现总结得不是很全,这里总结一下,防止大家再出现这个问题没有解决方法. Python的魅力之一,就是拥有众多功能强大的插件,但是这些插件的寻找.安装.升级在windows系统上却非常之麻烦.首先安装完Python后需要在系统配置环境变量,接下来又要安装Setuptools,而且安装过程中还会报编码错误,对于需要拷贝源码安装的还需要去CMD里打命令,还得小心翼翼避免打错参数,如果没有一位有经验

Python中getpass模块无回显输入源码解析

本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api,就花了点时间阅读了一下源码,感觉挺实用的,在这安利给大家. getpass.getpass(prompt='Password: ', stream=None) 调用该函数可以在命令行窗口里面无回显输入密码.参数prompt代表提示字符串,默认是'Password: '.在Unix系统中,strea

Python编程pygame模块实现移动的小车示例代码

Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚. 最近一个星期学习了一下python的pygame模块,顺便做个小程序巩固所学的,运行效果如下: 其中,背景图"highway.jpg"是使用PhotoShop将其分辨率改变为640 × 480,而小车"car.png"则是将其转变为png格式的图片,并且填充其背景色,让其拥有透明性. 代码测试可用: # -*

Python用sndhdr模块识别音频格式详解

本文主要介绍了Python编程中,用sndhdr模块识别音频格式的相关内容,具体如下. sndhdr模块 功能描述:sndhdr模块提供检测音频类型的接口. 唯一一个API sndhdr模块提供了sndhdr.what(filename)和sndhdr.whathdr(filename)两个函数.但实际上它们的功能是一样的.(不知道多写一个的意义何在,what函数在内部调用了whathdr函数并把数据完完整整地返回) 在之前的版本,whathdr函数返回元组类型的数据,在Python3.5版本之

Python基础之getpass模块详细介绍

本文主要给大家介绍了关于Python中getpass模块的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: getpass模块提供了平台无关的在命令行下输入密码的方法; 该模块主要提供: 两个函数: getuser, getpass 一个报警: GetPassWarning(当输入的密码可能会显示的时候抛出,该报警为UserWarning的一个子类) 备注: 上面为密码显示时抛出的报警 getpass.getuser() 该函数返回登陆的用户名,不需要参数 该函数会检查环境变

python Crypto模块的安装与使用方法

前言 最开始想尝试在windows下面安装python3.6,虽然python安装成功,但在安装Cryto模块用pip3 install pycrypto老是会报错.老夫搞了半天,最终决定在linux下面去做. 以下流程限于linux系统: Crypto不是自带的模块,需要下载.http://www.voidspace.org.uk/python/modules.shtml#pycrypto 我下载了之后,发现下载的是crypto而不是Crypto(就是差个首字母大小写) 而crypto.Cip

Python Paramiko模块的安装与使用详解

一.前言 常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了.而使用paramiko可以很好的解决以上问题,比起前面的方法,它仅需要在本地上安装相应的软件(python以及PyCrypto),对远程服务器没有配置要求,对于连接多台服务器,进行复杂的连接操作特别有帮助.下面本文就来详细的介绍Python Paramiko模块的安装与使用,一起学习学习吧.. 二.安装 安装paramik

python cx_Oracle模块的安装和使用详细介绍

python cx_Oracle模块的安装 最近需要写一个数据迁移脚本,将单一Oracle中的数据迁移到MySQL Sharding集群,在linux下安装cx_Oracle感觉还是有一点麻烦的,整理一下,做个总结. 对于Oracle客户端,不只需要安装相应的python模块(这里我用了Oracle官方的python模块--cx_Oracle),还需要安装Oracle Client,一般选择Instant Client就足够了,还需要配置tnsnames.ora(当然也可以简单的通过host:p

python中模块查找的原理与方法详解

前言 本文主要给大家介绍了关于python模块查找的原理与方式,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 基础概念 module 模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块 package 包,包含有 __init__ 文件的文件夹 relative path 相对路径,相对于某个目录的路径 absolute path 绝对路径,全路径 路径查找 python 解释器查找被引入的包或模块 Python 解释器是如何查找包和模块的 Python 执行一

MySQL 的模块不能安装的解决方法

我们最常用的 DBD::mysql 模块,我发现是难住很多人的地方.因为安装老是失败,下面我介绍一下解决方法,比如我使用 cpanm 安装,有时就出 /home/nue2501j/work/DBD-mysql-4.010/blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: DBIc_TRACE_LEVEL at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/DynaLoader.pm line 23

Mac中Python 3环境下安装scrapy的方法教程

前言 最近抽空想学习一下python的爬虫框架scrapy,在mac下安装的时候遇到了问题,逐一解决了问题,分享一下,话不多说了,来一起看看详细的介绍吧. 步骤如下: 1. 从官网 下载最新版本Python 3.6.3(本地快速下载安装:http://www.jb51.net/softs/583651.html) # 在Mac上Python3环境下安装scrapy 2. 安装 Python3 在终端输入python3出现下面的内容表示安装成功 ➜ ~ python3 Python 3.6.3 (

Apache防DDOS模块mod_evasive安装和配置方法详解

一.mod_evasive 介绍mod_evasive 是Apache(httpd)服务器的防DDOS的一个模块.对于WEB服务器来说,是目前比较好的一个防护DDOS攻击的扩展模块.虽然并不能完全防御DDOS攻击,但在一定条件下,还是起到缓服Apache(httpd)服务器的压力.如配合iptables.硬件防火墙等防火墙设备配合使用,可能有更好的效果.mod_evasive 的官方地址: http://www.zdziarski.com/二.mod_evasive 工作原理Apache模块mo

linux环境下python中MySQLdb模块的安装方法

前言 最近开始学习python数据库编程后,在了解了基本概念,打算上手试验一下时,卡在了MYSQLdb包的安装上,折腾了半天才解决.记录一下我在linux中安装此包遇到的问题. 系统是ubuntn15.04. 1.下载 第一个问题是pycharm软件的模块安装功能Project Interpreter无法自动下载安装MYSQLdb包,显示 Error occurred when installling package 那没办法了,只好手动下载了.MYSQLdb包linux系统的下载的地址是:ht

python使用xlrd模块读写Excel文件的方法

本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境. 二.使用介绍 1.导入模块 复制代码 代码如下: import xlrd 2.打开Excel文件读取数据 复制代码 代码如下: data = xlrd.open_workbook('excelFile.xls') 3.使用技巧 获取一个工作表

python添加模块搜索路径方法

1.函数添加 import sys sys.path sys.path.append("c:\\") 2.修改pythonpath(试不通) windows:PYTHONPATH 3.增加.pth文件(可以) site-packages或者python安装目录添加 xx.pth,文件内容为模块目录. linux(ubuntu)    /usr/local/lib/python2.7/dist-packages linux(redhat)    /usr/lib/python2.7/si

windows下安装python paramiko模块的代码

1.安装python  windows版本好:python-2.5.1.msi 2.安装pycrypto windows版本号:pycrypto-2.0.1.win32-py2.5.exe地址:http://tmrc.mit.edu/mirror/twisted/Dependencies/Win/pycrypto-2.0.1.win32-py2.5.exe 3. 安装MySQL DB Module for Python 2.5地址:http://sourceforge.net/projects/