查看: 102|回复: 3

Python qrcode库详解:安装配置与QRCode类参数、自定义样式及纠错级别实践

[复制链接]
发表于 5 小时前 | 显示全部楼层 |阅读模式
在日常开发中,生成二维码是常见需求,尤其是在自动化脚本、数据分发、移动端扫码场景中。Python 的 python-qrcode 库提供了一个纯 Python 实现的二维码生成器,无需依赖外部库,支持参数化定制和多种输出格式。本文基于该库的 QRCode 核心类,详细讲解安装流程、构造参数、数据添加、图像输出,并深入分析错误纠正级别的选择与自定义颜色、大小等高级用法。
  1. pip install python-qrcode[pil]
复制代码

安装时附加 [pil] 会自动安装 Pillow 库,用于图像处理。安装完成后导入库并确认版本:
  1. import qrcode
  2. print(qrcode.__version__)
复制代码

一、QRCode 类构造参数详解

QRCode 类是生成二维码的核心,其构造方法支持以下参数:

- version:二维码尺寸版本(1~40),1 最小,40 最大。版本越高容量越大。
- error_correction:纠错级别,取值:
  - ERROR_CORRECT_L:约7%纠错
  - ERROR_CORRECT_M:约15%纠错(默认)
  - ERROR_CORRECT_Q:约25%纠错
  - ERROR_CORRECT_H:约30%纠错
- box_size:每个小格(像素点)的像素数。
- border:二维码边界空白格的数目(默认为4)。

实例化示例:
  1. qr = qrcode.QRCode(
  2.     version=1,
  3.     error_correction=qrcode.constants.ERROR_CORRECT_M,
  4.     box_size=10,
  5.     border=4
  6. )
复制代码

二、添加数据与生成图像

使用 add_data() 添加待编码的数据(字符串、URL等),然后调用 make(fit=True) 自动适配版本大小。最后通过 make_image() 输出图片:
  1. qr.add_data('https://www.example.com')
  2. qr.make(fit=True)
  3. img = qr.make_image(fill_color="black", back_color="white")
  4. img.save('example_qrcode.png')
复制代码

fill_color 控制二维码前景色,back_color 控制背景色,支持颜色名称或 RGB 元组。例如设置蓝色前景:
  1. img = qr.make_image(fill_color=(0, 176, 240), back_color=(255, 255, 255))
复制代码

make_image() 默认使用 PIL 生成 PNG 图片,也可通过 image_factory 参数指定其他图像库,如 Pillow 的 Image 类。

三、调整二维码图片大小

生成图片后可使用 resize() 方法改变尺寸:
  1. img = img.resize((500, 500), resample=3)
  2. img.save('large_qrcode.png')
复制代码

注意 resize 会改变像素尺寸,不影响二维码数据正确性。

四、错误纠正级别的选择与影响

高纠错级别能容忍更多污损或遮挡,但会减少数据容量。例如设置最高纠错级别:
  1. qr = qrcode.QRCode(
  2.     version=1,
  3.     error_correction=qrcode.constants.ERROR_CORRECT_H,
  4.     box_size=10,
  5.     border=4
  6. )
  7. qr.add_data('https://www.example.com')
  8. qr.make(fit=True)
  9. img = qr.make_image(fill='black', back_color='white')
  10. img.save('high_correction_qrcode.png')
复制代码

实际应用场景:户外广告牌、易磨损的标签建议使用 H 级;纸质印刷物、内部系统可使用 L 级以容纳更多数据。

五、支持多数据类型与链接跳转

二维码可编码文本、URL、电话号码等。对于电话,建议前缀 tel:+国际编码:
  1. qr.add_data('tel:+123456789')
复制代码

生成包含 URL 的二维码后,用户扫码即可跳转网页。若需嵌入网页并通过 JavaScript 处理点击事件,可整合前后端:
  1. <html>
  2. <body>
  3. <img src="web_qrcode.png" id="qrcode" onclick="window.location.href=this.src;">
  4. </body>
  5. </html>
复制代码

六、扩展:在二维码中心嵌入 Logo

结合 Pillow 的 paste 方法,可将 Logo 图片叠加到二维码中心:
  1. from PIL import Image
  2. import qrcode
  3. qrcode_img = qrcode.make('https://www.example.com')
  4. logo = Image.open('logo.png')
  5. w, h = qrcode_img.size
  6. logo_w, logo_h = logo.size
  7. left = (w - logo_w) // 2
  8. top = (h - logo_h) // 2
  9. qrcode_img.paste(logo, (left, top))
  10. qrcode_img.save('logo_qrcode.png')
复制代码

注意:嵌入 Logo 会遮挡部分数据点,需选择较高纠错级别以保证可识别。

七、总结

通过 python-qrcode 库,开发者可以快速生成定制化的二维码。关键要点:合理设置 version 控制容量;根据场景选择 error_correction 平衡纠错与密度;利用 make_image 参数自定义颜色;结合 Pillow 实现图片缩放与 Logo 嵌入。在实际项目中,建议先测试不同参数组合下的扫码兼容性,确保在多种扫描器上表现一致。
回复

使用道具 举报

发表于 5 小时前 | 显示全部楼层

Re: Python qrcode库详解:安装配置与QRCode类参数、自定义样式及纠错级别实践

感谢楼主分享这么详细的教程!之前我虽然用过 `qrcode` 库,但一直没仔细琢磨各个参数的平衡,尤其是 `version` 和 `error_correction` 的搭配 —— 为了追求高纠错直接把 H 级拉满,结果数据稍微多一点就报错,原来要先调 `fit=True` 让它自动适配。另外那个嵌入 logo 的贴图方法很实用,我之前都是手动抠图再拼,太笨了。想请教一下,楼主在实际项目中遇到过某些老式扫码枪对自定义颜色(比如浅色前景)识别不佳的情况吗?我试过几次,发现黑色背景+白色方块反而最稳定,不知道是不是心理作用。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python qrcode库详解:安装配置与QRCode类参数、自定义样式及纠错级别实践

感谢楼主分享这么详细的教程!对于QRCode类的各个参数解释得很清楚,特别是纠错级别的对比和实际场景建议很有用。我之前一直用默认的,现在知道可以根据场景调整了。另外,嵌入logo那部分也很实用,不过想问一下,如果logo比较大,是否会影响扫码成功率?有没有推荐的logo大小比例?
回复 支持 反对

使用道具 举报

发表于 25 分钟前 | 显示全部楼层

Re: Python qrcode库详解:安装配置与QRCode类参数、自定义样式及纠错级别实践

感谢楼主分享这么详细的教程!之前用过qrcode库,但一直没认真研究过参数细节,特别是纠错级别对实际扫码的影响。你提到的H级纠错在户外场景很实用,下次给设备贴标签时可以试试。另外,嵌入Logo那部分刚好是我最近想实现的功能,没想到用paste这么简单就能搞定,受教了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-16 17:50 , Processed in 0.025369 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部