果然够炫酷!用 Python 生成炫酷二维码及解析
二维码结构
首先,我们来简单了解一下二维码的结构,如下图所示:
从图中我们可以看出二维码结构整体划分为功能图形和编码区两大部分,功能图形又细分为:空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形,而编码区细分为:格式信息、版本信息、数据和纠错码字,来简单了解一下每一部分的功能:
-
空白区:留白,不需要做任何处理
-
位置探测图形:协助扫描软件定位二维码码
-
位置探测图形分隔符:区分功能图形和编码区
-
定位图形:指示标识密度和确定坐标系
-
校正图形:校正图形的数量和位置
-
格式信息:存放格式化数据的信息
-
版本信息:二维码的规格,二维码符号共有 40 种规格的矩阵
-
数据和纠错码字:实际保存的二维码信息和纠错码字(用于修正二维码损坏带来的错误)
生成二维码
创建二维码我们可以使用 qrcode 和 myqr 两个 Python 库,下面来具体看一下。
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')
看一下效果:
解析二维码
import zxing
reader = zxing.BarCodeReader()
barcode = reader.decode('myqr.gif')
print(barcode.parsed)
执行结果:
https://www.baidu.com/
当然我们还可以对现有二维码进行美化,实现方式为:
-
解析现有二维码内容
-
使用解析的内容生成新的二维码
看一下实现代码:
import zxing
from MyQR import myqr
reader = zxing.BarCodeReader()
barcode = reader.decode('gzh.jpg')
myqr.run(words=str(barcode.parsed),
version=1,
picture='my.gif',
colorized=True,
save_name='gmyqr.gif')
看一下效果:
总结
【代码获取方式】