
本文详解如何在 python 中利用 qrcode 和 pil 库生成带透明背景的 qr 码图像,解决 `back_color=none` 无效、默认黑底等问题,并提供可直接运行的修复代码与关键注意事项。
在使用 qrcode 库生成 QR 码时,一个常见误区是认为将 back_color=None 即可获得透明背景。实际上,qrcode 的 make_image() 方法不支持 None 作为 back_color 值——它会静默回退为默认黑色背景("black"),导致后续即使转为 RGBA 模式也无法恢复透明通道。
✅ 正确做法是:显式传入字符串 "transparent" 作为 back_color 参数。该值被 qrcode 内部识别并用于创建带 Alpha 通道的图像(即 RGBA 模式),从而真正实现背景透明。
以下是修复后的核心代码段(已整合进原函数逻辑):
def generate_qr_code_with_text(data, text_row1, text_row2, text_row3, output_path, qr_size_pixels=227):
try:
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
# ✅ 关键修复:使用 "transparent" 而非 None 或 "white"
img = qr.make_image(fill_color=(255, 255, 255), back_color="transparent")
img = img.resize((qr_size_pixels, qr_size_pixels), Image.Resampling.LANCZOS)
# ✅ 确保 final_img 为 RGBA,且背景完全透明
final_img = Image.new('RGBA', (img.width, img.height + 90), color=(255, 255, 255, 0))
final_img.paste(img, (0, 0), mask=img) # ? 添加 mask 参数以保留 alpha 通道
draw = ImageDraw.Draw(final_img)
font = ImageFont.load_default()
# 文字绘制保持不变(自动兼容 RGBA)
text_row1_position = (final_img.size[0] // 2, img.size[1] + 10)
draw.text(text_row1_position, f"Row 1: {text_row1}", fill="black", font=font, anchor="mm")
text_row2_position = (final_img.size[0] // 2, img.size[1] + 30)
draw.text(text_row2_position, f"Row 2: {text_row2}", fill="black", font=font, anchor="mm")
text_row3_position = (final_img.size[0] // 2, img.size[1] + 50)
draw.text(text_row3_position, f"Row 3: {text_row3}", fill="black", font=font, anchor="mm")
# ✅ 保存为支持透明度的格式(PNG)
final_img.save(output_path, format="PNG")
return True
except Exception as e:
print(f"QR 生成失败: {e}")
return False? 关键注意事项:
- back_color="transparent" 是唯一可靠方式;back_color=None 或 back_color=(0,0,0,0) 均无效;
- 保存时务必使用 format="PNG"(JPEG 不支持透明通道);
- Image.new('RGBA', ..., color=(255,255,255,0)) 中 (255,255,255,0) 表示「白色+完全透明」,视觉上等效于纯透明背景;
- final_img.paste(..., mask=img) 中的 mask=img 参数至关重要——它确保 QR 码自身的 Alpha 通道被正确应用,避免白色边框或半透明残留;
- 若后续需嵌入 PDF(如用 fpdf2),请确认所用 PDF 库支持 PNG 透明度(fpdf2 ≥ v2.7.4 支持,旧版 fpdf 不支持)。
通过以上调整,你将获得真正背景透明、边缘清晰、可无缝叠加于任意底色或设计中的 QR 码图像。










