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)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章