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不是整张图片的主体,而是融入在背景当中,这仍然不影响识别。(而本文题图没有被知乎强制识别,我推测是因为题图的位置问题)

经验分享 程序员 微信小程序 职场和发展