python生成带logo的二维码

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)

在这里插入图片描述

关注微信公众号:菜鸟阿都,一起交流学习

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值