Python二维码生成案例与实战教程(含完整代码)
目录导读
- 为什么选择Python生成二维码?
- [核心库对比:qrcode vs myqr vs pillow](#二、核心库对比:qrcode vs myqr vs pillow)
- 基础案例:生成一个普通二维码并保存
- 进阶案例:自定义颜色、尺寸与Logo嵌入
- 高级案例:生成带动态背景或艺术二维码
- 常见问题与避坑指南(FAQ)
- 如何根据场景选择最佳方案
为什么选择Python生成二维码?
在数字营销、物流追踪、活动签到等场景中,二维码已成为连接线下与线上的钥匙,相比于在线生成器,用Python生成二维码具有三大优势:

- 批量自动化:几千个商品码只需几行代码
- 数据不出本地:敏感信息(如会员链接)不经过第三方服务器
- 样式完全可控:嵌入Logo、渐变色、艺术边框等
❓ 问:Python生成二维码必须联网吗?
答:核心库qrcode和myqr都是本地纯算法,无需联网,但若需要在线识别或解码,则需借助第三方API。
核心库对比:qrcode vs myqr vs pillow
在动手之前,先理清三个最常用的库:
| 库名 | 安装命令 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| qrcode | pip install qrcode[pil] |
简单稳定,支持多种纠错级别 | 无法嵌入Logo,颜色调整需二次开发 | 标准二维码、批量生成 |
| myqr | pip install myqr |
支持自定义Logo、背景图片、渐进色 | 依赖C++编译(Windows需装Visual C++) | 营销海报、个人品牌码 |
| pillow + qrcode | pip install pillow |
可控制每个像素,灵活嵌入Logo | 代码稍长,需懂图像处理基础 | 企业级定制、带复杂Logo的码 |
推荐组合:日常用qrcode,需Logo时用myqr,追求极致定制时用pillow二次开发。
❓ 问:myqr在Windows上安装报错怎么解决?
答:先安装Visual C++ Build Tools,或者改用qrcode + pillow方式实现Logo嵌入,见下文。
基础案例:生成一个普通二维码并保存
这个案例是入门第一课,适用于所有Python环境(包括树莓派、VPS)。
# 1. 安装库
# pip install qrcode[pil]
import qrcode
# 2. 准备数据(可以是网址、文本、数字)
data = "https://www.example.com"
# 3. 生成二维码对象
qr = qrcode.QRCode(
version=1, # 控制二维码大小:1~40,1最小(21x21)
error_correction=qrcode.constants.ERROR_CORRECT_M,
# 纠错级别:L(7%)、M(15%)、Q(25%)、H(30%)推荐M或H
box_size=10, # 每个像素点的大小(像素)
border=4 # 二维码白边宽度(盒子数)
)
qr.add_data(data)
qr.make(fit=True) # 自动选择最小版本
# 4. 生成图像(默认是黑白)
img = qr.make_image(fill_color="black", back_color="white")
img.save("my_qrcode.png") # 可改为 .jpg / .bmp
运行后效果:当前目录出现 my_qrcode.png,用微信扫一扫即可跳转到 example.com。
❓ 问:
version参数如何选择更合理的值?
答:version=1能存约25个字母数字,version=40可以存4296个字符,可以先设version=None让代码自动适配。
进阶案例:自定义颜色、尺寸与Logo嵌入
如果希望二维码更有品牌感,可以加入彩色背景和Logo图片,这里我们用qrcode + pillow实现(无需myqr)。
import qrcode
from PIL import Image, ImageDraw
def create_custom_qr(data, logo_path=None, save_path="custom_qr.png"):
# 1. 生成基础二维码(白色背景)
qr = qrcode.QRCode(version=2, error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10, border=2)
qr.add_data(data)
qr.make(fit=True)
# 2. 改为彩色:用RGB模式并填充渐变(这里用纯蓝)
img = qr.make_image(fill_color="#2196F3", back_color="#FFE0B2").convert("RGB")
# 3. 嵌入Logo(可选)
if logo_path:
logo = Image.open(logo_path).convert("RGBA")
# 计算Logo大小(二维码的1/5)
factor = 5
logo_size = img.size[0] // factor
logo = logo.resize((logo_size, logo_size), Image.LANCZOS)
# 计算中心位置
pos = ((img.size[0] - logo_size) // 2, (img.size[1] - logo_size) // 2)
# 合并图像(注意透明度)
img.paste(logo, pos, mask=logo.split()[3] if logo.mode == "RGBA" else None)
img.save(save_path)
print(f"✅ 二维码已保存至:{save_path}")
# 使用示例
create_custom_qr("https://www.example.com", logo_path="logo.png")
效果说明:二维码背景变为暖橙色,前景为蓝色,中心嵌入一个透明背景的Logo,纠错级别设为H(30%),即使Logo遮住部分区域仍可正常扫码。
❓ 问:Logo覆盖后扫码失败怎么办?
答:用ERROR_CORRECT_H;同时Logo面积不要超过二维码的25%(本例只占1/5面积)。
高级案例:生成带动态背景或艺术二维码
想生成类似“渐变星空背景”或“圆形二维码”?可用myqr库快速实现,或者用qrcode + pillow逐像素处理。
方案A:使用myqr(最简单)
# pip install myqr
from MyQR import myqr
# 参数说明:background可指定背景图片(推荐方形图)
myqr.run(
words="https://www.example.com",
version=5,
level='H',
picture="background.jpg", # 背景图片(可选)
colorized=True, # 是否彩色
contrast=1.0,
brightness=1.0,
save_name="artistic_qr.png",
save_dir="./"
)
注意:picture背景图片建议与二维码同样尺寸,否则会拉伸,myqr生成的二维码内置了Logo占位功能,但Logo需要在words中通过特殊语法嵌入(不推荐新手使用)。
方案B:纯PIL手造艺术二维码(可控性强)
如果想实现“二维码路径上渐变彩虹色,背景透明”,可参考以下思路:
- 先用
qrcode生成黑白二维码图 - 通过
PIL.ImageOps.colorize()将黑色变为渐变 - 通过
numpy数组处理每个像素,即可实现任意图案
# 伪代码示例(完整版需额外处理)
from PIL import ImageOps
img = qrcode.make("data")
colored = ImageOps.colorize(img, "red", "blue") # 渐变
colored.save("rainbow_qr.png")
❓ 问:艺术二维码会不会降低扫码成功率?
答:会的,建议保持传统三个角定位块(回形方块)的黑色/白色反差,且不要在上面覆盖图案,很多艺术二维码为了美观牺牲了稳定性,生产环境需反复测试。
常见问题与避坑指南(FAQ)
Q1:生成的二维码显示“乱码”或“无法识别”?
原因:数据中包含非UTF-8字符(如中文URL)
解决:确保data字符串是纯英文或已URL编码,中文需用urllib.parse.quote()转码:
from urllib.parse import quote
data = "https://example.com/?name=" + quote("张先生")
Q2:二维码扫描后出现“已过期”或“404”?
原因:生成的二维码只是静态图片,链接是否有效取决于目标服务器
解决:生成前先测试链接;如果是本地文件,需确保路径正确且文件存在。
Q3:如何批量生成100个不同内容的二维码?
核心代码:
urls = ["url1", "url2", ...] # 可以从Excel或文本文件读取
for i, url in enumerate(urls):
qr = qrcode.make(url)
qr.save(f"qr_{i}.png")
提速技巧:用os.cpu_count()开启多线程。
Q4:生成的二维码图片模糊怎么办?
原因:box_size太小
解决:增大box_size(如15或20),同时注意文件大小,扫面一般用300dpi以上即可清晰。
Q5:是否支持生成gif动态二维码?
目前主流库(qrcode、myqr)均不支持直接生成动态码,但可以通过PIL逐帧合成帧动画,但动态码往往扫码失败率较高,不推荐生产使用。
如何根据场景选择最佳方案
| 场景 | 推荐方案 | 代码行数 | 示例 |
|---|---|---|---|
| 个人博客链接 | qrcode库基础生成 | 5行 | img = qrcode.make("url") |
| 活动海报扫码 | myqr带背景图片 | 8行 | myqr.run(words="...", picture="bg.png") |
| 企业统一品牌码 | pillow + 额外Logo + 标准颜色 | 30行 | 见第四节代码 |
| 批量生成100+码 | qrcode + for循环 + 文件处理 | 10行 | qr.save(f"../output/{i}.png") |
黄金法则:用高纠错级别(H),Logo面积控制在20%以内,生成后务必用三台不同手机扫码测试。
延伸阅读:如果希望二维码在扫码后自动识别用户来源(如带utm参数),可以在链接中加入跟踪参数;如需解码二维码,可用pyzbar或zbar库反向读取。
若有其他问题,欢迎在评论区留言,本文涉及的代码已去伪存:只保留稳定、经过验证的用法,避免使用已废弃或兼容性差的API。