用 Python 生成炫酷二维码及解析
说到二维码大家一定不陌生,可以说现在二维码几乎渗透到了我们生活的各个角落,举例来说吧,我们到超市商场购物时扫描二维码付款,我们出行时乘坐公交地铁扫描二维码进站,我们到菜鸟驿站取件时扫描二维码取件,如果哪天我们碰到一个有趣的人,可能还会微信扫描二维码加个好友,如果你阅读我们的文章感觉对自己有一点帮助,还可以扫描文末二维码关注一下我们的公众号。
我们通过 Python 生成以及识别二维码需要用到的库为:qrcode、myqr、zxing,安装通过 pip install qrcode/myqr/zxing
即可。
二维码结构
首先,我们来简单了解一下二维码的结构,如下图所示:
从图中我们可以看出二维码结构整体划分为功能图形和编码区两大部分,功能图形又细分为:空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形,而编码区细分为:格式信息、版本信息、数据和纠错码字,来简单了解一下每一部分的功能:
空白区:留白,不需要做任何处理
位置探测图形:协助扫描软件定位二维码码
位置探测图形分隔符:区分功能图形和编码区
定位图形:指示标识密度和确定坐标系
校正图形:校正图形的数量和位置
格式信息:存放格式化数据的信息
版本信息:二维码的规格,二维码符号共有 40 种规格的矩阵
数据和纠错码字:实际保存的二维码信息和纠错码字(用于修正二维码损坏带来的错误)
生成二维码
创建二维码我们可以使用 qrcode 和 myqr 两个 Python 库,下面来具体看一下。
qrcode
生活我们可能会看到一些二维码,在我们扫描之后跳到了某个地址,这样的功能 qrcode 就可以实现,来看一下示例:
import qrcode
# 二维码内容(链接地址或文字)
data = 'https://www.baidu.com/'
# 生成二维码
img = qrcode.make(data=data)
# 显示二维码
img.show()
# 保存二维码
# img.save('qr.jpg')
看一下效果:
我们扫描上面这个二维码就可以跳转到我们设置的地址了。
上面的二维码比较原始,我们还可以对其进行简单的设置和美化,代码实现如下所示:
import qrcode
'''
version:二维码的格子矩阵大小,可以是 1 到 40,1 最小为 21*21,40 是 177*177
error_correction:二维码错误容许率,默认 ERROR_CORRECT_M,容许小于 15% 的错误率
box_size:二维码每个小格子包含的像素数量
border:二维码到图片边框的小格子数,默认值为 4
'''
qr = qrcode.QRCode(
version=2,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=15,
border=3,
)
# 二维码内容
data = 'https://www.baidu.com/'
qr.add_data(data=data)
# 启用二维码颜色设置
qr.make(fit=True)
img = qr.make_image(fill_color='blue', back_color='white')
# 显示二维码
img.show()
看一下效果:
myqr
如果我们对上面生成二维码的样式不满意,我们就需要用到 myqr 库了,它不仅可以生成普通二维码,还可以生成带图片的二维码以及动态二维码,但我们想要查看生成的二维码时,需要到保存位置手动打开查看。
普通二维码
我们先使用 myqr 来生成一个普通二维码,看一下示例:
from MyQR import myqr
'''
words:内容
version:容错率
save_name:保存的名字
'''
myqr.run(words='https://www.baidu.com/',
version=1,
save_name='myqr.png')
看一下效果:
带图二维码
我们接着使用 myqr 来生成一个带图的二维码,看一下示例:
from MyQR import myqr
'''
picture:生成二维码用到的图片
colorized:False 为黑白,True 为彩色
'''
myqr.run(words='https://www.baidu.com/',
version=1,
picture='bg.jpg',
colorized=True,
save_name='pmyqr.png')
看一下效果:
动态二维码
最后,我们使用 myqr 来生成一个动态二维码,看一下示例:
from MyQR import myqr
myqr.run(words='https://www.baidu.com/',
version=1,
picture='my.gif',
colorized=True,
save_name='myqr.gif')
看一下效果: