二维码不止一种,本文介绍最常见的QR二维码。由于不能发二维码截图,所以所有的执行结果都隐去了。完整版本可以移步到此查看:https://vblogs.cn/momo1938/article?id=0407576070659864
python 可以使用qrcode来生成二维码,python 安装时多半以内置了这个包,没有的话可以先安装以下这个包:
pip install qrcode
简单示例,生成包含百度地址的二维码:
import qrcode
#添加二维码信息
img = qrcode.make('https://baidu.com')
#保存二维码图片
img.save('01.png')
生成的图片示例,扫描即可打开百度
版本1大小为21X21矩阵,版本40大小177x177矩阵。版本越大,容纳的信息量越大,版本1容纳的字符数约十几个,版本40理论上可容纳7000多个字符,大约1800个汉字。
import qrcode
img = qrcode.make('https://baidu.com',version=40)
img.save('02.png')
版本为1和40二维码对比:
此参数控制用于二维码的纠错。有四个级别,如下所示:
ERROR_CORRECT_L: 7%
ERROR_CORRECT_M:15%
ERROR_CORRECT_Q:25%
ERROR_CORRECT_H:30%
什么是纠错? 即使编码变脏或破损,也可自动恢复数据。上面的四个级别表示当二维码的损毁部分不大于这个百分比时,二维码依旧可以被正确识别:
示例,加入纠错:
import qrcode
img = qrcode.make(
'',
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
)
img.save('03.png')
然后将生成的二维码擦出掉右下角一部分,依旧可以被识别。
此参数在版本号相同的情况下,像素数越高,二维码尺寸越大,但二维码尺寸并不完全由此参数决定。
img = qrcode.make(
'https://baidu.com',
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=15
)
img.save('04.png')
在版本号相同的情况下,box_size = 15 和 50的对比:
此处的边框指的的外围空白区域。
import qrcode
img = qrcode.make(
'https://baidu.com',
version=1,
box_size=15,
border=8
)
img.save('05.png')
边框为2 和 边框为8 的对比:
二维码的尺寸与这几个参数有关:version ,border ,box_size,具体计算公式如下: qr_size = (21 + (version - 1) * 4 + border * 2) * box_size
二维码生成时容错级别当然是越高越好,但容错级别越高,所能容纳的数据量就小,也会增大二维码的尺寸。这个需要自己根据情况取舍。
import qrcode
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data('https://baidu.com')
#填充色和背景色
img = qr.make_image(fill_color='palegreen',back_color='lightgoldenrodyellow')
img.save('color.png')
其中的填充色和背景色必须时web支持的颜色值。否则会报错,生成的二维码:
web颜色值是W3C定义的颜色标准,一共140种,感兴趣可自行搜索了解,这里不再一一列举。
由于需要借助其它的库,这里不再详细解释,给出示例和注释,需要时可直接拷贝代码。
使用myqr库pip install myqr:
from MyQR import myqr
myqr.run(
words="https://baidu.com/",
version=1,
picture="bg.jpg",
colorized=True,
save_name="bg.png",
)
生成结果:
也可将背景图替换为gif.生成动态二维码。
# coding: utf-8
import qrcode
from PIL import Image # 依赖的库是pillow,常用的图片处理库
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data('https://badiu.com')
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img = img.convert("RGBA")
#logo
logo = Image.open("logo.png")
# 获取二维码的尺寸
img_w, img_h = img.size
scale = 6
size_w = int(img_w / scale)
size_h = int(img_h / scale)
logo_w, logo_h = logo.size
if logo_w > size_w:
logo_w = size_w
if logo_h > size_h:
logo_h = size_h
# 设置logo的尺寸和位置
logo = logo.resize((logo_w, logo_h), Image.ANTIALIAS)
w = int((img_w - logo_w) / 2)
h = int((img_h - logo_h) / 2)
img.paste(logo, (w, h), logo)
img.save('11.png')
生成结果:
使用opencv 库来识别二维码:
pip install opencv-python
读取示例:
import cv2
qr_file = "01.png"
qr_image = cv2.imread(qr_file)
qr_detector = cv2.QRCodeDetector()
data, bbox, straight_qrcode = qr_detector.detectAndDecode(qr_image)
print(data)
控制台输出:
$ python 06-4.py
https://baidu.com