如何用Pillow或OpenCV在二维码旁及下方添加文本?
给二维码添加侧边和底部文本的实现方案
核心思路
不用ImageOps.fit,直接通过创建新画布、拼接二维码和文本层的方式更直观可控,步骤清晰:
- 加载目标二维码图片,定义文本内容及样式参数
- 计算所需的画布尺寸,预留文本区域空间
- 将二维码粘贴到画布指定位置
- 用
ImageDraw在侧边和底部绘制文本 - 导出最终合成图片
完整代码示例
from PIL import Image, ImageDraw, ImageFont def add_text_to_qr(qr_path, side_text, bottom_text, output_path): # 加载二维码图片 qr_img = Image.open(qr_path).convert("RGB") qr_w, qr_h = qr_img.size # 可自定义的配置参数 font_path = "arial.ttf" # 替换为你本地的字体文件路径 side_font_size = 20 bottom_font_size = 24 padding = 10 # 文本与二维码的间距 side_text_width = 150 # 侧边文本区域的宽度 # 计算文本高度,确定新画布尺寸 temp_draw = ImageDraw.Draw(Image.new("RGB", (1,1))) side_font = ImageFont.truetype(font_path, side_font_size) bottom_font = ImageFont.truetype(font_path, bottom_font_size) _, bottom_text_h = temp_draw.textsize(bottom_text, font=bottom_font) new_canvas_w = qr_w + side_text_width + padding new_canvas_h = qr_h + bottom_text_h + padding * 2 # 创建白色背景的新画布 new_img = Image.new("RGB", (new_canvas_w, new_canvas_h), color="white") # 将二维码粘贴到画布左侧(带内边距) new_img.paste(qr_img, (padding, padding)) # 绘制右侧侧边文本 draw = ImageDraw.Draw(new_img) side_text_x = qr_w + padding * 2 side_text_y = padding + (qr_h - temp_draw.textsize(side_text, font=side_font)[1]) // 2 draw.text((side_text_x, side_text_y), side_text, font=side_font, fill="black") # 绘制底部居中文本 bottom_text_x = padding + (qr_w - temp_draw.textsize(bottom_text, font=bottom_font)[0]) // 2 bottom_text_y = qr_h + padding * 2 draw.text((bottom_text_x, bottom_text_y), bottom_text, font=bottom_font, fill="black") # 保存最终图片 new_img.save(output_path) # 调用示例 add_text_to_qr("qrcode.png", "扫码查看详情", "有效期至2025年12月", "qr_with_text.png")
自定义调整说明
- 若要将文本放在二维码左侧,只需调整二维码粘贴位置为
(side_text_width + padding*2, padding),侧边文本的x坐标改为padding - 字体文件可替换为系统内置字体,比如Windows的
simhei.ttf、macOS的PingFang SC.ttc - 长文本需要换行时,可拆分字符串为多行,逐行计算y坐标后绘制,保证文本对齐
内容的提问来源于stack exchange,提问作者DaveR
相关产品推荐
相关产品推荐

