发布于2026-06-30 阅读(0)
扫一扫,手机访问
说到二维码,大家肯定都不陌生。它本质上是一种矩阵条码,能比传统条码存下更多信息,比如网址、联系人、地理位置,甚至一段文本。在 Python 里,qrcode 库就是专门用来干这个活的——它提供了生成、定制、保存二维码的一整套 API,配合 Pillow 还能直接输出图片文件。下面我们就来一步步搞定这件事,从最基础的安装,到参数调优、颜色定制,再到最后加个 Logo 都安排上。




先看看一个可直接运行的完整脚本,用户输入网址和文件名就能生成二维码并保存到指定目录。后续再拆开细讲每个参数的作用。
# 地址生成二维码
import qrcode
import os
# 创建QRCode对象
qr = qrcode.QRCode(
# 控制二维码的大小,1是最小的矩阵13x13,数值越大尺寸越大,可存储的信息也越多
version=1,
# 控制二维码的错误纠错能力
# ERROR_CORRECT_L 大约7%或更少的错误会被更正
error_correction=qrcode.constants.ERROR_CORRECT_L,
# 控制每一个点(box)的像素数
box_size=10,
# 控制边框(最小值为4)
border=4,
)
# 添加数据到QRCode对象
# qr.add_data() 方法在 qrcode 库中用于向 QR 码对象添加数据。
# 这些数据并不一定是网站的 URL,它们可以是任何形式的有效字符串,
# 只要这些数据能够被 QR 码编码并且解码后能够被目标设备或应用程序正确识别和处理。
# https://www.baidu.com
data = input("请输入您的网址:")
# 注意:如果输入的内容包含特殊字符或非常长的字符串,
# 可能需要在生成二维码前进行验证或预处理,以确保其能够被正确编码和解码。
qr.add_data(f"{data}")
qr.make(fit=True) # 参数fit=True用于在可能的情况下调整二维码大小以适应数据
# 生成图像
# 可以将生成的二维码保存为文件,例如PNG格式
img = qr.make_image(fill='black', back_color='white')
# 保存二维码图像并显示
img_name = input("请输入您的二维码照片名字(或输入带后缀的名字如mycode.png):")
if not img_name.lower().endswith('.png'):
# 检查后缀,但注意qrcode默认生成PNG
# 如果用户没有输入.png,则添加.png(因为qrcode生成的是PNG)
img_name = img_name + ".png"
# 允许用户输入保存目录和文件名
sa ve_dir = input("请输入您想要保存二维码的目录(例如:C:/Users/YourName/Pictures/):")
# 确保目录末尾有斜杠(如果不是根目录的话)
# 使用os.sep来获取当前操作系统的路径分隔符,以确保路径在不同操作系统上都是正确的
# 首先检查 sa ve_dir 是否不以 os.sep 结尾,并且确保它不是一个空字符串。
# 如果这两个条件都满足,那么它就在 sa ve_dir 的末尾添加一个路径分隔符。
if not sa ve_dir.endswith(os.sep) and sa ve_dir != "":
sa ve_dir += os.sep
# 检查目录是否存在,不存在则创建(exist_ok=True参数允许目录已经存在而不引发错误)
os.makedirs(sa ve_dir, exist_ok=True)
# 构建完整的文件路径
full_path = os.path.join(sa ve_dir, img_name)
# 显示保存的位置
print(f"二维码生成地址为: {full_path}")
# 保存二维码图像(一般为你写的文件夹目录下)
img.sa ve(full_path)
print(f"二维码已生成并保存为: {img_name}")
# 尝试显示图像
# 添加异常处理来捕获img.show()可能引发的错误,并在无法显示图像时打印一条消息。
try:
img.show()
except Exception as e:
print(f"无法显示图像:{e}")
运行后的效果就是这样:



如果只是简单生成一个二维码,上面那段脚本已经够用了。但实际项目中往往需要控制尺寸、纠错等级、颜色,甚至往二维码中心加个 Logo。这里把常用的知识点拆开细讲。
1. 安装 qrcode 库
打开终端,一行命令搞定:
pip install qrcode[pil]
加上 [pil] 会自动安装 Pillow 库,这样生成的二维码才能保存为图片文件。如果只装 qrcode 本身也可以,但就不能直接生成图片了。
2. 基础示例:生成二维码并保存为图片
import qrcode
# 要编码的网址
url = "https://www.example.com"
# 创建 QRCode 对象
qr = qrcode.QRCode(
version=1, # 控制二维码的尺寸(1-40),1 是最小尺寸
error_correction=qrcode.constants.ERROR_CORRECT_L, # 纠错等级
box_size=10, # 每个小格子的大小(像素)
border=4, # 边框宽度(格子数)
)
# 添加数据
qr.add_data(url)
qr.make(fit=True)
# 生成图像
img = qr.make_image(fill_color="black", back_color="white")
# 保存图片
img.sa ve("qrcode_example.png")
运行后当前目录下就会出现 qrcode_example.png,手机扫一下就能跳转到对应的网址。
3. 参数详解
这几个参数决定了二维码的形态和容错能力,挨个看明白才能灵活配置。
| 参数 | 说明 |
|---|---|
version | 整数 1~40,控制二维码的网格数量。1 为 21×21,每增加 1 版本,边长增加 4 格。设为 None 或 fit=True 可自动调整。 |
error_correction | 纠错等级: - ERROR_CORRECT_L:约 7% 的字码可被修正- ERROR_CORRECT_M(默认):约 15%- ERROR_CORRECT_Q:约 25%- ERROR_CORRECT_H:约 30% |
box_size | 每个小格子的像素大小,例如 10 表示每个格子 10×10 像素。 |
border | 二维码四周留白的格子数,默认 4(至少需要 4 格以确保扫描识别)。 |
fill_color | 前景色(即二维码颜色),默认黑色。 |
back_color | 背景色,默认白色。 |
值得强调的是 version 和 error_correction 的关系:版本越大能塞的数据越多,但也会让二维码变大;纠错等级越高,二维码被遮挡一部分后依然能扫出来,代价是同样尺寸下能存的数据变少。所以,如果你准备在二维码中心贴个 Logo,一定得用 ERROR_CORRECT_H,否则 Logo 一盖可能就读不出来了。
4. 高级用法
除了保存文件,qrcode 还能做很多灵活的事。比如在 Jupyter Notebook 里直接显示、把图片转为字节流供 Web 响应、甚至改颜色改形状。
生成二维码并直接显示(Jupyter Notebook 或 GUI):
import qrcode
from PIL import Image
qr = qrcode.QRCode(box_size=5, border=2)
qr.add_data("https://www.google.com")
qr.make(fit=True)
img = qr.make_image(fill_color="blue", back_color="yellow")
# 在 Jupyter 中显示
from IPython.display import display
display(img)
# 或者直接调用 show() 打开系统图片查看器(需要 Pillow)
img.show()
生成二维码并转为字节流(不保存文件,直接用于 Web 响应):
import qrcode
from io import BytesIO
qr = qrcode.QRCode()
qr.add_data("https://www.github.com")
qr.make(fit=True)
img = qr.make_image()
# 保存到内存中的字节流
img_byte_arr = BytesIO()
img.sa ve(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
# 此时 img_byte_arr 可直接作为 HTTP 响应返回,或写入文件等操作
自定义二维码颜色和形状(使用 Pillow 进一步处理):
import qrcode
from PIL import Image, ImageDraw
# 生成普通二维码
qr = qrcode.QRCode(box_size=8, border=2)
qr.add_data("https://www.python.org")
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white").convert('RGB')
# 将二维码颜色改为渐变色(这里简单示例:将黑色区域变为红色)
pixels = img.load()
for i in range(img.size[0]):
for j in range(img.size[1]):
if pixels[i, j] == (0, 0, 0): # 黑色部分
pixels[i, j] = (255, 0, 0) # 改为红色
img.sa ve("red_qrcode.png")
5. 注意事项
version,要么先用短链接服务(比如 bit.ly)压缩一下。ERROR_CORRECT_H,否则 Logo 一贴就废了。6. 完整示例:带 Logo 的二维码
把 Logo 贴在二维码中心是很多品牌运营的常规操作,既好看又保留了一部分识别能力。注意先把 Logo 图片放在同级目录下。
import qrcode
from PIL import Image
# 创建二维码
qr = qrcode.QRCode(
version=5,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data("https://www.example.com")
qr.make(fit=True)
# 生成图像
img = qr.make_image(fill_color="black", back_color="white").convert('RGB')
# 打开 Logo 图片并调整大小
logo = Image.open("logo.png")
logo_size = 80
logo = logo.resize((logo_size, logo_size))
# 计算粘贴位置(中心)
pos = ((img.size[0] - logo_size) // 2, (img.size[1] - logo_size) // 2)
img.paste(logo, pos)
img.sa ve("qrcode_with_logo.png")
到这里,从安装到定制、从基础到带 Logo 的完整流程就都覆盖了。以后遇到扫码需求,直接掏这段代码出来改改就能用上。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8