最近有个需求:需要生成中间带品牌文字的二维码。
以前的做法要么是去搜在线生成器(怕带广告/不安全),要么是用 Python 生成二维码后再打开 PS 把 logo P 上去,太麻烦了。
于是随手撸了一个 Python 脚本,分享给大家
核心功能:
无需准备 Logo 图片:脚本会自动根据你输入的文字(比如品牌名),动态画一张正方形图片放在二维码中间。
自动居中 & 适配字体:自动调用系统字体,把文字居中画在色块里。
高容错率 (30%):开启了 QR Code 的 H 级容错,中间挡住一大块照样能秒扫。
交互式操作:运行脚本 -> 弹窗输链接 -> 弹窗输文字 -> 出图。
🛠️ 环境依赖: 只需要装 qrcode 和 Pillow 两个库:
pip install qrcode[pil] pillow
完整源码 (保存为 qr_maker.py 直接运行)
import qrcode
from PIL import Image, ImageDraw, ImageFont
import os
import tkinter as tk
from tkinter import simpledialog
import platform
def get_user_input():
"""弹出输入框获取用户输入"""
root = tk.Tk()
root.withdraw() # 隐藏主窗口
# 1. 获取链接
url = simpledialog.askstring("步骤 1/2", "请输入二维码跳转链接:\n(例如: https://www.google.com)")
if not url: return None, None
# 2. 获取品牌文字
brand_text = simpledialog.askstring("步骤 2/2", "请输入中间显示的品牌文字/字母:\n(建议1-4个字母,例如: VIP)")
if not brand_text: brand_text = "Q" # 默认值
return url, brand_text
def create_text_logo_img(text, size, bg_color="black", text_color="white"):
"""根据文字生成一张正方形图片"""
# 1. 创建背景图 (RGBA模式)
img = Image.new('RGBA', (size, size), bg_color)
draw = ImageDraw.Draw(img)
# 2. 尝试加载字体 (优先使用Arial,否则使用默认)
font_size = int(size * 0.5)
try:
# 简单适配不同系统的字体路径
font_path = "arial.ttf"
if platform.system() == "Darwin": font_path = "Arial.ttf"
elif platform.system() == "Linux": font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
font = ImageFont.truetype(font_path, font_size)
except IOError:
font = ImageFont.load_default()
# 3. 绘制文字 (居中)
draw.text((size/2, size/2), text, font=font, fill=text_color, anchor="mm")
return img
def generate_qr(url, brand_text):
print(f"正在生成...")
# --- 1. 生成基础二维码 ---
qr = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_H, # 关键:30%高容错率
box_size=10,
border=4,
)
qr.add_data(url)
qr.make(fit=True)
qr_img = qr.make_image(fill_color="black", back_color="white").convert('RGBA')
# --- 2. 动态生成文字Logo ---
qr_w, qr_h = qr_img.size
logo_size = int(qr_w / 4) # Logo占总宽度的 1/4
# 生成文字图片 (默认黑底白字,显眼)
logo_img = create_text_logo_img(brand_text, logo_size, bg_color="black", text_color="white")
# --- 3. 粘贴 ---
pos_x = (qr_w - logo_size) // 2
pos_y = (qr_h - logo_size) // 2
qr_img.paste(logo_img, (pos_x, pos_y))
# --- 4. 保存 ---
save_name = f"QR_{brand_text}.png"
# 清理非法文件名字符
save_name = "".join([c for c in save_name if c.isalnum() or c in (' ', '.', '_')]).strip()
qr_img.save(save_name)
print(f"✅ 成功!已保存为: {os.path.abspath(save_name)}")
if __name__ == '__main__':
url_in, text_in = get_user_input()
if url_in:
generate_qr(url_in, text_in)
DIY 小技巧: 如果你想改中间 Logo 的颜色(比如想要蓝底白字),找到代码里 create_text_logo_img 调用的地方,改成:
bg_color="#0055AA", text_color="white"
挺简单的一个小工具,有需要的拿去玩
这样不太行吧 你直接截张图看看logo啥样的 啥也没有
感谢分享。
来个预览看看
@awop #1 @hankhu #3

我带图来啦
@zwt13703 #4
不错
感觉这种做成一个网页前端会方便很多