python解析二维码_Python如何识别二维码
最近呢,知乎发表了一个报告说,安全防护系统全面升级了(是小管家说的)。
现在内容中的二维码会被自动替换为相应的链接,并缀以“(二维码自动识别)”字样。
今天就来看,如何用Python自动识别二维码。
01. 编码
首先要熟悉一套理论:什么是二维码?
条形码我们都见过,这就是一种“一维码”。竖直方向上,条码是均匀的,长短也不影响,信息只在水平方向上存储。
二维码的信息则在整个平面上存储,当下常见的二维码叫QR码(Quick Response Code)。实际上广义的二维码有很多形式,比如以前机器编程用的打孔带,还有考试的答题卡也是一个原理。
二维码的一大优势在于容错率高,即使遮挡一部分,也不影响解码。这就是为什么很多QR code会在中间放一个图标,本质上来说,这个图标就相当于给二维码又打了个码。
如果把太极图看作二进制,那么这也是个二维码,白的是0,黑的是1。
QR code存储信息的基本套路就跟“阴阳”类似,白0黑1。特别显眼的那几个方块和虚线,则是辅助定位用的。
>>>这里本来有个二维码图样,展示各个区域的作用,但是被自动识别了。<<<
Mr. Watson, come here - I want to see you. (二维码自动识别)
边边角角上的特定区域都按照标准存储固定的信息,就像一张卷子上不可能全是题,总有写班级姓名的地方。
需要编码的目标字符首先转换为二进制数,这个数的位数与QR code的尺寸有关。二级制数字就可以映射为非黑即白的色块,再依照标准套路填充到数据区域。
虽然被编码的内容各不相同,但是我们生活中所见到的QR code似乎长得都差不多,看起来都比较“均匀”,这是“掩码”的作用。
掩码就像Photoshop里的“蒙版”,与原始数据做“异或”计算后,出来的码看起来就匀和了。
02. 解码
解码是编码的逆过程,就是还原出原本的信息。在Python中,用到一个库,叫zbar。
说起来这个库别扭的很(因为本来并不是用Python写的,外部依赖较多),首先官网上的包最高只支持Python 2.6,不姿慈2.7;其次,2.6就2.6吧,但是安装却一直失败,不论Linux,Win10还是Mac;最后发现只支持32位系统,我又装了一个XP虚拟机。
当那熟悉的开机音乐随着蓝天绿地出现的时候,我仿佛回到了家里刚买电脑的那个下午。
一个姿慈Python 2.7的zbar安装包:
除zbar库之外,还需要PIL库以进行图片操作。
03. 微小的示例
#-*- coding: utf-8 -*-
import zbar
from PIL import Image
#创建图片扫描对象
scanner = zbar.ImageScanner()
#设置对象属性
scanner.parse_config(enable)
#打开含有二维码的图片
img = Image.open(<你的图片路径>).convert(L)
#获取图片的尺寸
width, height = img.size
#建立zbar图片对象并扫描转换为字节信息
qrCode = zbar.Image(width, height, Y800, img.tobytes())
scanner.scan(qrCode)
data =
for s in qrCode:
data += s.data
# 删除图片对象
del img
# 输出解码结果
print data
运行结果:
以上案例中,所用的是本文的题图,QR code不是整张图片的主体,而是融入在背景当中,这仍然不影响识别。(而本文题图没有被知乎强制识别,我推测是因为题图的位置问题)