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 的值范围通常在 0 到 255 之间,其中 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 表示图像背景是完全透明的。