python 系列 06 -生成及解析二维码

0 说明

二维码不止一种,本文介绍最常见的QR二维码。由于不能发二维码截图,所以所有的执行结果都隐去了。完整版本可以移步到此查看:https://vblogs.cn/momo1938/article?id=0407576070659864

1 安装包

python 可以使用qrcode来生成二维码,python 安装时多半以内置了这个包,没有的话可以先安装以下这个包:

pip install qrcode

2 生成二维码

2.1 简单示例

简单示例,生成包含百度地址的二维码:

import qrcode

#添加二维码信息
img = qrcode.make('https://baidu.com')

#保存二维码图片
img.save('01.png')

生成的图片示例,扫描即可打开百度

2.2 二维码的主要参数

2.2.1 Version:版本,取值范围1-40。

版本1大小为21X21矩阵,版本40大小177x177矩阵。版本越大,容纳的信息量越大,版本1容纳的字符数约十几个,版本40理论上可容纳7000多个字符,大约1800个汉字。

import qrcode
img = qrcode.make('https://baidu.com',version=40)
img.save('02.png')

版本为1和40二维码对比:

2.2.2 error_correction 二维码纠错

此参数控制用于二维码的纠错。有四个级别,如下所示:

ERROR_CORRECT_L: 7%

ERROR_CORRECT_M:15%

ERROR_CORRECT_Q:25%

ERROR_CORRECT_H:30%

什么是纠错? 即使编码变脏或破损,也可自动恢复数据。上面的四个级别表示当二维码的损毁部分不大于这个百分比时,二维码依旧可以被正确识别:

示例,加入纠错:

import qrcode

img = qrcode.make(
    'https://csdn.net',
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
)
img.save('03.png')

然后将生成的二维码擦出掉右下角一部分,依旧可以被识别。

2.2.3 box_size 控制框内像素数

此参数在版本号相同的情况下,像素数越高,二维码尺寸越大,但二维码尺寸并不完全由此参数决定。

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的对比:

2.2.4 border:控制边框的粗细。默认边框为 4 像素。

此处的边框指的的外围空白区域。

import qrcode
img = qrcode.make(
    'https://baidu.com',
    version=1,
    box_size=15,
    border=8
)
img.save('05.png')

边框为2 和 边框为8 的对比:

2.2.5 顺便说一下二维码的尺寸

二维码的尺寸与这几个参数有关:version ,border ,box_size,具体计算公式如下:
qr_size = (21 + (version - 1) * 4 + border * 2) * box_size

2.2.6 其它说明

二维码生成时容错级别当然是越高越好,但容错级别越高,所能容纳的数据量就小,也会增大二维码的尺寸。这个需要自己根据情况取舍。

2.2 生成彩色二维码

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种,感兴趣可自行搜索了解,这里不再一一列举。

2.3 其它二维码

由于需要借助其它的库,这里不再详细解释,给出示例和注释,需要时可直接拷贝代码。

2.3.1 带背景图片的二维码

使用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.生成动态二维码。

2.3.2 生成内置logo的二维码

# 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')

生成结果:

3 读取或识别二维码

使用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
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值