Python 实战:生成二维码并集成到图片添加自动换行中文文字

一、引言

在数字化时代,二维码的应用极为广泛,无论是商业推广、信息分享还是活动参与,都能看到二维码的身影。有时候,我们需要将生成的二维码与特定的图片结合,并在下方添加相关说明文字。本文将详细介绍如何使用 Python 实现生成二维码,将其贴到空白图上,并在二维码下方添加自动换行且居中的中文文字,同时解决可能出现的中文乱码和 textsize 方法弃用问题,最后提供一个可直接运行的实际操作案例。

二、环境准备

在开始编写代码之前,我们需要安装两个关键的 Python 库:qrcode 和 Pillowqrcode 库用于生成二维码,Pillow 是 Python 中强大的图像处理库,用于处理图片和添加文字。可以使用以下命令进行安装:

pip install qrcode pillow

三、代码实现思路

整个实现过程主要分为以下几个步骤:

  1. 生成二维码:使用 qrcode 库根据指定的数据生成二维码图片。
  2. 创建空白图:使用 Pillow 库创建一个指定大小的空白图片。
  3. 粘贴二维码:将生成的二维码图片粘贴到空白图的合适位置。
  4. 添加自动换行且居中的中文文字:根据图片宽度和文字内容,将文字自动换行,并在二维码下方居中显示,同时解决中文乱码问题。

四、完整代码示例

import qrcode
from PIL import Image, ImageDraw, ImageFont

def generate_qr_code(data):
    """
    生成二维码图片
    :param data: 二维码包含的数据
    :return: 二维码图片对象
    """
    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)
    img = qr.make_image(fill_color="black", back_color="white")
    return img

def paste_qr_on_blank(qr_img, blank_width, blank_height):
    """
    将二维码粘贴到空白图上
    :param qr_img: 二维码图片对象
    :param blank_width: 空白图的宽度
    :param blank_height: 空白图的高度
    :return: 粘贴二维码后的图片对象
    """
    blank_img = Image.new('RGB', (blank_width, blank_height), color='white')
    qr_width, qr_height = qr_img.size
    x = (blank_width - qr_width) // 2
    y = (blank_height - qr_height) // 2
    blank_img.paste(qr_img, (x, y))
    return blank_img

def add_text_to_image(img, text, font_size=20, line_spacing=5):
    """
    在图片上添加自动换行且居中的文字
    :param img: 图片对象
    :param text: 要添加的文字内容
    :param font_size: 文字字体大小
    :param line_spacing: 行间距
    :return: 添加文字后的图片对象
    """
    # 指定支持中文的字体文件路径,这里以 Windows 系统的 simhei.ttf 为例
    # 如果你使用其他系统,需要替换为相应支持中文的字体文件路径
    font_path = "simhei.ttf"
    font = ImageFont.truetype(font_path, font_size)
    draw = ImageDraw.Draw(img)
    img_width, _ = img.size
    max_chars_per_line = img_width // font_size
    lines = []
    while text:
        if len(text) <= max_chars_per_line:
            lines.append(text)
            text = ""
        else:
            index = text.rfind(' ', 0, max_chars_per_line)
            if index == -1:
                index = max_chars_per_line
            lines.append(text[:index])
            text = text[index:].lstrip()
    qr_width, qr_height = qr_img.size
    qr_x = (img_width - qr_width) // 2
    qr_y = (img.height - qr_height) // 2
    text_y = qr_y + qr_height + 10
    for line in lines:
        # 使用 textbbox 方法替代 textsize
        left, top, right, bottom = draw.textbbox((0, 0), line, font=font)
        line_width = right - left
        line_height = bottom - top
        text_x = (img_width - line_width) // 2
        draw.text((text_x, text_y), line, fill='black', font=font)
        text_y += line_height + line_spacing
    return img

if __name__ == "__main__":
    # 二维码包含的数据
    qr_data = "https://www.example.com"
    # 生成二维码
    qr_img = generate_qr_code(qr_data)
    # 空白图的宽度和高度
    blank_width = 500
    blank_height = 600
    # 将二维码粘贴到空白图上
    combined_img = paste_qr_on_blank(qr_img, blank_width, blank_height)
    # 要添加的中文文字内容
    text = "这是一段示例文字,用于展示如何在二维码下方添加自动换行且居中的文字。"
    # 在图片上添加文字
    final_img = add_text_to_image(combined_img, text)
    # 保存最终图片
    final_img.save("final_image.png")
    print("图片生成完成,已保存为 final_image.png")

五、代码解释

1. generate_qr_code 函数

该函数接受一个字符串数据作为参数,使用 qrcode 库生成对应的二维码图片对象并返回。通过设置二维码的版本、纠错级别、方块大小和边框等参数,确保生成的二维码符合需求。

2. paste_qr_on_blank 函数

接受二维码图片对象和空白图的宽度、高度作为参数,创建一个空白图,并将二维码图片居中粘贴到空白图上,最后返回粘贴后的图片对象。通过计算二维码在空白图上的居中位置,实现了二维码的完美粘贴。

3. add_text_to_image 函数

  • 字体设置:使用 ImageFont.truetype 方法加载支持中文的字体文件(如 simhei.ttf),解决中文乱码问题。
  • 文字换行:根据图片宽度计算每行最大字符数,将文字自动换行。
  • 文字居中:使用 textbbox 方法获取每行文字的宽度和高度,计算出文字的居中位置并绘制到图片上。

4. 主程序

在 if __name__ == "__main__" 块中,定义了二维码数据、空白图的大小和要添加的中文文字内容,依次调用上述三个函数生成最终图片,并保存为 final_image.png

六、注意事项和扩展

字体文件获取

  • Windows 系统:字体文件一般存放在 C:\Windows\Fonts 路径下,找到 simhei.ttf 复制到项目目录即可(或者自行在网上下载字体)。
  • 其他系统:可使用开源免费的黑体类字体,如思源黑体,从 Adobe 开源字体库 下载。

其他扩展

  • 字体设置:可以根据需要修改字体大小、颜色和样式,以获得更好的视觉效果。
  • 图片大小调整:可以根据实际需求调整空白图的宽度和高度,以及二维码的大小。

七、总结

通过本文的介绍和代码示例,你可以轻松使用 Python 生成二维码,将其集成到空白图上,并在下方添加自动换行且居中的中文文字。这个功能在很多实际场景中都非常有用,如制作海报、宣传页等。希望本文能帮助你快速实现相关需求,如果你在实践过程中遇到任何问题,欢迎在评论区留言交流。

你可能感兴趣的:(python)