如何用Python生成包含独立文本与图片(Logo)的QR Code?
可以用Python实现同时包含文本与图片的二维码,分两种场景处理:
场景1:扫描后解析出文本+图片内容
这种方案是把文本和图片数据(或地址)打包成结构化数据存入二维码,扫描后解析数据即可同时获取并展示两者,适合需要扫描后同时呈现文本和图片的需求。
实现步骤:
- 安装依赖:
pip install qrcode[pil] pillow
- 代码实现:
import qrcode import json import base64 from PIL import Image # 定义要存储的文本和本地Logo路径 text_info = "这是要展示的文本内容" logo_file = "logo.png" # 将Logo转为Base64编码(方便打包进JSON) with open(logo_file, "rb") as f: logo_base64 = base64.b64encode(f.read()).decode("utf-8") # 把文本和图片数据打包成JSON格式 qr_payload = json.dumps({ "text": text_info, "image": logo_base64 }) # 生成高容错二维码(避免数据量过大导致识别失败) qr = qrcode.QRCode( version=3, # 版本越高可存储数据越多,根据实际调整 error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=8, border=4 ) qr.add_data(qr_payload) qr.make(fit=True) # 生成并保存二维码图片 final_qr = qr.make_image(fill_color="black", back_color="white") final_qr.save("text_image_combined_qr.png") # ------------------------------ # 模拟扫描后的解析操作 # ------------------------------ # from pyzbar.pyzbar import decode # # 读取二维码并解析数据 # decoded_result = decode(Image.open("text_image_combined_qr.png")) # parsed_data = json.loads(decoded_result[0].data.decode("utf-8")) # # 提取文本 # print("文本内容:", parsed_data["text"]) # # 将Base64转回图片 # recovered_logo = base64.b64decode(parsed_data["image"]) # with open("recovered_logo.png", "wb") as f: # f.write(recovered_logo)
注意事项:
- Base64编码会增大数据体积,若图片较大,需调高二维码的
version参数,同时保持高容错级别(ERROR_CORRECT_H)。 - 如果图片是网络地址,也可以直接把URL存入JSON,无需转Base64,扫描后直接通过URL加载图片。
场景2:视觉上带Logo的二维码(扫描后仅获取文本)
这种方案是在普通文本二维码的中心叠加Logo图片,不影响二维码的识别功能,扫描后仍得到文本,Logo仅作为视觉装饰,适合需要品牌展示但核心信息是文本的场景。
代码实现:
import qrcode from PIL import Image # 生成文本二维码 text_content = "扫描后得到的文本信息" qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_H, # 高容错确保Logo不干扰识别 box_size=10, border=4 ) qr.add_data(text_content) qr.make(fit=True) qr_image = qr.make_image(fill_color="black", back_color="white").convert("RGB") # 加载并调整Logo大小(建议不超过二维码的1/5) logo = Image.open("logo.png") qr_width, qr_height = qr_image.size logo_size = int(qr_width / 5) logo = logo.resize((logo_size, logo_size), Image.Resampling.LANCZOS) # 计算Logo的中心位置 logo_pos = ((qr_width - logo_size) // 2, (qr_height - logo_size) // 2) # 叠加Logo到二维码上(支持透明背景的Logo) qr_image.paste(logo, logo_pos, mask=logo if logo.mode == "RGBA" else None) # 保存最终二维码 qr_image.save("qr_with_visual_logo.png")
注意事项:
- Logo尺寸不能过大,否则会遮挡二维码的识别区域,建议控制在二维码宽度的1/5以内。
- 使用高容错级别(
ERROR_CORRECT_H)可以最大程度避免Logo对识别的影响。
内容的提问来源于stack exchange,提问作者veoli
相关产品推荐
相关产品推荐

