python--生成二维码和显示二维码文字

代码效果图

import qrcode
from PIL import Image, ImageDraw,ImageFont

def generate_qr_code(qr_img,data):

    qr_size = qr_img.size
    # 1.获取文本的尺寸用于创建最终背景图大小 -- 背景图,因为按二维码的大小去生成最终图片,文字太长可能会被截取掉
    font = ImageFont.truetype("arialbd.ttf", size=50)  # 使用系统字体Arial,大小为200
    text_bbox = font.getbbox(data)
    text_width = text_bbox[2] - text_bbox[0]
    text_height = text_bbox[3] - text_bbox[1]
    print(f'文本尺寸{text_width},{text_height}')

    #2.创建背景图
    #处理背景图的尺寸大小
    #如果文本横向长度没有超过二维码的长度,则以二维码长度+文本的高度 作为背景图最终的大小
    if max(max(text_height,text_width),qr_size[0]) == qr_size[0]:
        bg_img_size =  (qr_size[0] + text_height, qr_size[0] + text_height)
    # 如果文本横向长度超过二维码的长度,则以文本横向长度 作为背景图最终的大小
    else:
        bg_img_size =  (max(max(text_height,text_width),qr_size[0]),max(max(text_height,text_width),qr_size[0]))

    bg_img = Image.new('RGB', bg_img_size,color='white')
    # bg_img = Image.new('RGBA', bg_img_size, color=(255, 255, 255, 0)) #透明的背景

    background_size = bg_img.size
    print(f'背景尺寸{background_size}')

    print(qr_size)



    #3. 修改二维码图像大小
    qr_img = qr_img.resize(qr_size, resample=Image.Resampling.LANCZOS)
    width, height = qr_img.size
    print(f'二维码尺寸{width},{height}',width, height)

    #4. 将二维码粘贴到背景上
    x = (background_size[0] - qr_size[0]) // 2
    y = (background_size[1] - qr_size[1]) // 2
    qr_img.crop(qr_img.getbbox())
    bg_img.paste(qr_img, (x, y))

    #5. 将文本粘贴到背景上
    text_img = Image.new('RGB', (text_width, text_height), color='white')

    text_img_x = (background_size[0] - text_width) / 2
    text_img_y = qr_img.size[1] + y
    draw = ImageDraw.Draw(bg_img)
    #计算文本位置
    text_position = (text_img_x, text_img_y)
    print(f'计算文本位置{text_position}')
    draw.text(text_position, data, fill="black", font=font)

    #5.1 截取图片大小

    bg_img = bg_img.crop((0, y, background_size[0], y + qr_size[1] + 40 + text_height ))
    crop_size_width = bg_img.size[0]
    crop_size_hight = bg_img.size[1]
    print(f'截取图片大小{crop_size_width},{crop_size_hight}')

    #6.重新修正最终二维码图片大小 等比例缩放尺寸
    resize = 290
    scale = crop_size_hight/resize
    new_width_size = int(crop_size_width/scale)
    print(f'最终尺寸{new_width_size},{resize}')
    bg_img = bg_img.resize((new_width_size,resize), resample=Image.LANCZOS)
    bg_img.show()
    return bg_img



def test():
    data = "XCLSH2406000044XCLSH2406000044"
    # 创建QRCode对象
    qr_img = qrcode.QRCode(
        version=1,  # 控制二维码的大小,从1到40
        error_correction=qrcode.constants.ERROR_CORRECT_L,  # 错误校正级别
        box_size=10,  # 每个“盒子”的像素数
        border=4,  # 边框的盒子数(默认为4,最小为1)
    )
    # 添加数据到二维码
    qr_img.add_data(data)
    qr_img.make(fit=True)  # 生成完整的二维码
    qr_img = qrcode.make(data)
    # 生成二维码和下方文字
    qr_img = generate_qr_code(qr_img,data)
    qr_img.save("temp.png")

1.qrcode.QRCode
qr_img = qrcode.QRCode(
version=1, # 控制二维码的大小,从1到40
error_correction=qrcode.constants.ERROR_CORRECT_L, # 错误校正级别
box_size=10, # 每个“盒子”的像素数
border=4, # 边框的盒子数(默认为4,最小为1)一个大概是10像素,4个说明二维码旁边的空白大概有40个像素
)
1.border=4, # 边框的盒子数(默认为4,最小为1)一个盒子是10像素(box_size=10),4个说明二维码旁边的空白大概有40个像素。这个在截取二维码空白的地方的时候十分有用。
2.创建透明的背景图
bg_img = Image.new(‘RGBA’, bg_img_size, color=(255, 255, 255, 0)) #透明的背景

Image.new():
这是 Pillow 库中的一个方法,用于创建一个新的空白图像对象。
'RGBA':
这是图像的颜色模式。在这里 'RGBA' 表示带有 Alpha 通道的 RGB 图像。RGB 是红绿蓝三个颜色通道,而 Alpha 通道用来存储图像的透明度信息。Alpha 的值范围通常在 0255 之间,其中 0 表示完全透明,255 表示完全不透明。
bg_img_size:
这是一个元组,表示新创建图像的宽度和高度。例如 (width, height)。这里的变量 bg_img_size 应该已经在之前的代码中定义好了。
color=(255, 255, 255, 0):
这是图像的背景颜色。由于我们正在使用 'RGBA' 模式,因此这里需要提供四个值:
第一个值 255 表示红色通道的强度,最大值为 255。
第二个值 255 表示绿色通道的强度,最大值为 255。
第三个值 255 表示蓝色通道的强度,最大值为 255。
第四个值 0 表示 Alpha 通道的强度,即透明度。这里的 0 表示图像背景是完全透明的。
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵钱孙李的赵

感谢各位衣食父母

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值