QRCode官网
https://pypi.python.org/pypi/qrcode/5.1
参数 version 表示生成二维码的尺寸大小,取值范围是 1 至 40,最小尺寸 1 会生成 21 * 21 的二维码,version 每增加 1,生成的二维码就会添加 4 尺寸,例如 version 是 2,则生成 25 * 25 的二维码。
参数 error_correction 指定二维码的容错系数,分别有以下4个系数:
1. ERROR_CORRECT_L: 7%的字码可被容错
2. ERROR_CORRECT_M: 15%的字码可被容错
3. ERROR_CORRECT_Q: 25%的字码可被容错
4. ERROR_CORRECT_H: 30%的字码可被容错
参数 box_size 表示二维码里每个格子的像素大小。
参数 border 表示边框的格子厚度是多少(默认是4)
import qrcode
import sys
from PIL import Image
import matplotlib.pyplot as plt
import traceback
import os
def log(message):
with open('../log.txt', "w", encoding="utf-8") as f:
f.write(message+'\n')
def getCode(value,logoPath,bgPath,x=356,y=869,version=10,box_size=30,factor=1):
log('二维码大小version:'+str(version))
log('二维码像素大小box_size:'+str(box_size))
qr = qrcode.QRCode(
version=version,
error_correction=qrcode.constants.ERROR_CORRECT_Q,
box_size=30,
border=1,
)
qr.add_data(value)
qr.make(fit=True)
img = qr.make_image( back_color="#FFF")
# 添加logo,打开logo照片
icon = Image.open(logoPath)
# 获取图片的宽高
img_w, img_h = img.size
# 参数设置logo的大小
factor = factor
log('logo大小参数:'+str(factor))
size_w = int(img_w / factor)
size_h = int(img_h / factor)
icon_w, icon_h = icon.size
if icon_w > size_w:
icon_w = size_w
if icon_h > size_h:
icon_h = size_h
# 重新设置logo的尺寸
icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
# 得到画图的x,y坐标,居中显示
w = int((img_w - icon_w) / 2)
h = int((img_h - icon_h) / 2)
# 黏贴logo照
img.paste(icon, (w, h), mask=None)
img.save('temp.png')
log('生成中间二维码tmp.png')
print(img.size)
top_img = Image.open('temp.png', 'r')
top_img_w, top_img_h = top_img.size
bottom_img = Image.open(bgPath, 'r')
bottom_img_w, bottom_img_h = bottom_img.size
offset = ((bottom_img_w - top_img_w) // 2, (bottom_img_h - top_img_h) // 2)
# # 二维码在背景中的图片
if x==356 and y==869:
x=offset[0]
y=offset[1]
print(x)
print(y)
log('二位码在背景图中的位置x,y:'+str(x)+':'+str(y))
bottom_img.paste(top_img,(x,y))
output_name = '../code/qrcode.jpg'
log('结果图保存位置:'+output_name)
bottom_img.save(output_name)
if __name__ == '__main__':
#para1:二位码内容 para2:logo地址 para3:背景地址 para4:logo图片x位置 para5:logo图片y位置
flag=0
# 二维码在背景中的位置
x=0
y=0
# 二维码大小
box_size=0
# 二维码像素
version=0
# logo大小比例参数
factor=0
if len(sys.argv) <5:
flag=1
elif len(sys.argv)<7 and len(sys.argv)>4:
flag=2
x=int(sys.argv[4])
y=int(sys.argv[5])
elif len(sys.argv)>6 and len(sys.argv)<9:
flag=3
x=int(sys.argv[4])
y=int(sys.argv[5])
version=int(sys.argv[6])
box_size=int(sys.argv[7])
elif len(sys.argv)>8 and len(sys.argv)<10:
flag=4
x=int(sys.argv[4])
y=int(sys.argv[5])
version=int(sys.argv[6])
box_size=int(sys.argv[7])
factor=int(sys.argv[8])
para=sys.argv[0]
para1=sys.argv[1]
para2=sys.argv[2]
para3=sys.argv[3]
log('参数1:'+para1)
log('参数2:'+para2)
log('参数3:'+para3)
print(para)
print(para1)
print(para2)
print(para3)
# el='soeiQrCode\\soeiQrCode.exe'
# para='C:\\Users\\ZL-01\\Desktop\\二维码\\soeiQrCode\\soeiQrCode.exe'
# path=para.replace(el,'')
# resultPath=path+'code\\'
# para1="这是一个二维码测试"
# para2='logo.png'
# para3='backgroundPic.jpg'
# para4=int('356')
# para5=int('869')
# x=0
# y=0
try:
if flag==1:
getCode(para1,para2,para3)
elif flag==2:
getCode(para1,para2,para3,x,y)
elif flag==3:
getCode(para1,para2,para3,x,y,version,box_size)
elif flag==4:
getCode(para1,para2,para3,x,y,version,box_size,factor)
except Exception as e:
print('error')
print(traceback.format_exc())
log(traceback.format_exc())
os._exit(1)
print('success')
if os.path.exists('temp.png'):
os.remove('temp.png')
log('success')
os._exit(0)
关注微信公众号:菜鸟阿都,一起交流学习