🌻自定义二维码
约 413 字大约 1 分钟
QRCode
2025-01-15
核心实现
基于 qrcode 和 PIL 生成带 logo 的二维码,通过矩阵遍历实现像素级渲染。
关键参数
error_correction: 使用ERROR_CORRECT_H保证 logo 覆盖后仍可识别box_size: 控制单个模块像素尺寸version: 自动适配数据量,1为最小版本
代码实现
import qrcode
from PIL import Image
# 配置二维码参数
data = "https://blog.paiad.top" # 替换为目标 URL
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
# 像素级渲染
matrix = qr.get_matrix()
qr_width = len(matrix) * 10
qr_height = len(matrix) * 10
qr_image = Image.new("RGB", (qr_width, qr_height), color="white")
pixels = qr_image.load()
for row in range(len(matrix)):
for col in range(len(matrix[row])):
color = (0, 0, 0) if matrix[row][col] else (255, 255, 255)
for i in range(10):
for j in range(10):
pixels[col * 10 + i, row * 10 + j] = color
# 嵌入中心 logo
logo = Image.open("img.png").convert("RGBA") # 替换为实际路径
logo_size = qr_width // 5
logo = logo.resize((logo_size, logo_size))
logo_position = ((qr_width - logo_size) // 2, (qr_height - logo_size) // 2)
qr_image.paste(logo, logo_position, mask=logo.split()[3])
# 输出
qr_image.save("generated_qrcode.png")
qr_image.show()使用说明
- 修改第 6 行
data为目标链接 - 替换第 28 行
img.png为 logo 路径 - 调整
box_size和border控制尺寸 - 运行后生成
generated_qrcode.png
技术细节
- 容错机制:
ERROR_CORRECT_H允许 30% 损坏仍可识别 - logo 尺寸: 占二维码宽度 1/5,避免过度遮挡
- 透明处理: 使用 RGBA 通道保留 logo 透明度
示例输出

