当前位置: 首页 > news >正文

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

0 说明

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

1 安装包

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

pip install qrcode

2 生成二维码

2.1 简单示例

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

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 qrcodeimg = 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 qrcodeqr = 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 myqrmyqr.run(words="https://baidu.com/",version=1,picture="bg.jpg",colorized=True,save_name="bg.png",
)

生成结果:

也可将背景图替换为gif.生成动态二维码。

2.3.2 生成内置logo的二维码

# coding: utf-8import 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.sizescale = 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 cv2qr_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
http://www.lryc.cn/news/44833.html

相关文章:

  • 2023第二届中国绿色钢铁国际峰会
  • java 高考志愿填报系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目
  • 机器学习 vs 深度学习:了解两者的异同
  • 流行的 DAW编曲软件FL Studio 21 有什么新功能?
  • 【Java】抽象类和接口
  • Lora:Low-Rank Adapation of Large Language models
  • 洛谷-P8466 [Aya Round 1 A] 幻想乡扑克游戏
  • HBase性能优化方法总结
  • Linux基础内容(16)—— 文件系统
  • Vue自定义事件
  • Java SE 基础 (6) 第一个Java程序
  • P1004 [NOIP2000 提高组] 方格取数
  • Leetcode.1024 视频拼接
  • 20个华为路由器常用的Python脚本,网工写自动化脚本时候可以参考!
  • 【kubernetes云原生】k8s资源管理命令与Namespace使用详解
  • String源码深度刨析
  • FreeRTOS - 消息队列
  • 怎样正确做 Web 应用的压力测试?
  • php mysql大学生求职招聘资源信息网zkfdzkf67a8
  • 2023上海市“星光计划”职业院校技能大赛 网络安全竞赛试题任务书
  • Spring事务源码:创建代理类
  • java14 使用增强的模式匹配切换表达式
  • python【正则表达式】
  • Ubuntu常见系统问题解决方式
  • C/C++中的虚拟内存
  • Qt C++与Python混合编程:补充错误
  • 2023-04-01:当Go语言遇见FFmpeg视频解码器,使用Go语言改写decode_video.c文件,提升视频解码效率与开发体验。
  • Solidity 学习笔记
  • ThreadLocal原理
  • 串操作指令详解 MOVS,LODS,STOS,CMPS,SCAS,REP