Python二维码生成案例如何生成二维码

wen python案例 24

Python二维码生成案例与实战教程(含完整代码)

目录导读


为什么选择Python生成二维码?

在数字营销、物流追踪、活动签到等场景中,二维码已成为连接线下与线上的钥匙,相比于在线生成器,用Python生成二维码具有三大优势

Python二维码生成案例如何生成二维码

  1. 批量自动化:几千个商品码只需几行代码
  2. 数据不出本地:敏感信息(如会员链接)不经过第三方服务器
  3. 样式完全可控:嵌入Logo、渐变色、艺术边框等

问:Python生成二维码必须联网吗?
答:核心库qrcodemyqr都是本地纯算法,无需联网,但若需要在线识别或解码,则需借助第三方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手造艺术二维码(可控性强)

如果想实现“二维码路径上渐变彩虹色,背景透明”,可参考以下思路:

  1. 先用qrcode生成黑白二维码图
  2. 通过PIL.ImageOps.colorize()将黑色变为渐变
  3. 通过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参数),可以在链接中加入跟踪参数;如需解码二维码,可用pyzbarzbar库反向读取。

若有其他问题,欢迎在评论区留言,本文涉及的代码已去伪存:只保留稳定、经过验证的用法,避免使用已废弃或兼容性差的API。

抱歉,评论功能暂时关闭!