python的第三方库很是丰富,前人造了很多好用的轮子,我们拿来即可使用。制作一张普通的没有啥标识度的二维码图片,显然不能满足我们了,至少要在中间打个logo,在底下再带上一行文字标签,才能方便自己和别人查看。
废话不说直接上代码:
from PIL import ImageFont, ImageDraw, Image
import qrcode
import os
import json
def createQrCode(text):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=20,
border=1,
)
qr.add_data(text)
qr.make(fit=True)
qrImg = qr.make_image(fill_color="black", back_color="white")
return qrImg
def createBg(qrImg):
img = qrImg.resize((580, 580), Image.LANCZOS)
bg = Image.new("RGB", (580, 660), "#ffffff")
bg.paste(img, (0, 0))
return bg
def drawFont(bg, text):
fontStyle = "e://work//simhei.ttf"
font = ImageFont.truetype(fontStyle, 48)
bbox = font.getbbox(text)
w,h = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw = ImageDraw.Draw(bg)
draw.text(((580 - w) / 2, 620 - h/2), text, fill="#000000", font=font)
return bg
def drawLogo(qr, logo, proportion):
w, h = qr.size
logo = Image.open(logo)
resizeW = (int(w * proportion))
logo = logo.resize((resizeW, resizeW), Image.LANCZOS)
logoW, logoH = logo.size
center = int((w - logoW) / 2)
qr.paste(logo, (center, center))
return qr
def draw(qrText, descText, logoPath, savePath, filename, proportion):
qrImg = createQrCode(qrText)
bgImg = createBg(qrImg)
bgImg2 = drawFont(bgImg, descText)
res = drawLogo(bgImg2, logoPath, proportion)
res.save(os.path.join(savePath, filename))
print(f"生成二维码『{filename}』成功")
with open('e://work//qrcodetext.json','rb') as qrfile :
qrdata = json.load(qrfile)
targetPath="e://work//qrpics//"
if not os.path.exists(targetPath) or os.path.isfile(targetPath):
os.mkdir(targetPath)
for i in range(len(qrdata)) :
draw(qrdata[i]["qrcode"],qrdata[i]["label"],"c://work//logo.png",targetPath,qrdata[i]["label"]+".png",0.4)
print("finished")
具体原理是先生成一张普通的二维码图片,然后拉伸下,底下留出一块空白区域,将标签文字以特定字体画到该区域,最后把logo图片放在二维码图形的中央区域。最后把整个图形保存到文件就完成了。
在二维码上叠加图片和文字,会不会导致二维码识别不了呢?是这样的,二维码是有容错率的。首先右上,左上,左下3个边角方框形状的标识区域是不能遮挡,总的遮挡面积不超过总面积的三分之一,一般来说都是没问题的,可以正常识别出来。