python的qrcode库生成二维码 圆角logo二维码 myqr库生成动态二维码
一、一般二维码
qrcode是个用来生成二维码图片的第三方模块,先安装:
pip install qrcode
import qrcode def process(self, msgs, user=None): qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data(msgs.value) qr.make(fit=True) img = qr.make_image() filemgr = FileMgr('log/wechat_files/') img_path = filemgr.make_path('.png') img.save(img_path) return TaskRsp(end=True,msgs=[TypedMessage(type='pic', value=img_path)])
QRCode参数详细说明:
- version: 一个整数,范围为1到40,表示二维码的大小(最小值是1,是个12×12的矩阵),如果想让程序自动生成,将值设置为 None 并使用 fit=True 参数即可。
- error_correction: 二维码的纠错范围,可以选择4个常量:
ERROR_CORRECT_L 7%以下的错误会被纠正
ERROR_CORRECT_M (default) 15%以下的错误会被纠正
ERROR_CORRECT_Q 25 %以下的错误会被纠正
ERROR_CORRECT_H. 30%以下的错误会被纠正 - boxsize: 每个点(方块)中的像素个数
- border: 二维码距图像外围边框距离,默认为4,而且相关规定最小为4
二、内置圆角logo的二维码
一般的二维码太丑,需要内置一个logo,为了美观还要对logo进行圆角处理
import qrcode from PIL import Image, ImageDraw # 设置圆角 def circle_crop_image(im, radii): # 创建一个黑色背景的画布 circle = Image.new('L', (radii * 2, radii * 2), 0) # 画黑色方形 draw = ImageDraw.Draw(circle) # 画白色圆形 draw.ellipse((0, 0, radii * 2, radii * 2), fill=255) # 把原图转换成RGBA模式,增加alpha通道 img = im.convert("RGBA") w, h = img.size # 画4个角(将整圆分离为4个部分)再粘贴到alpha通道 alpha = Image.new('L', img.size, 255) # 左上角 alpha.paste(circle.crop((0, 0, radii, radii)), (0, 0)) # 右上角 alpha.paste(circle.crop((radii, 0, radii * 2, radii)), (w - radii, 0)) # 右下角 alpha.paste(circle.crop((radii, radii, radii * 2, radii * 2)), (w - radii, h - radii)) # 左下角 alpha.paste(circle.crop((0, radii, radii, radii * 2)), (0, h - radii)) # 白色区域透明可见,黑色区域不可见 img.putalpha(alpha) return img # 生成二维码 def create_qr_code(url): qr = qrcode.QRCode( version=2, # 设置容错率为最高 error_correction=qrcode.ERROR_CORRECT_H, box_size=10, border=1, ) qr.add_data(url)
qr.make(fit=True) # 创建二维码图片 img = qr.make_image() # 图片转换为RGBA格式 img = img.convert("RGBA") # 打开logo图片 icon = Image.open('log/wechat_files/222.png') # 把RGB的图转换成RGBA模式,处理alpha透明通道(后边替换透明为白色) icon = icon.convert("RGBA") w, h = img.size icon_w, icon_h = icon.size # logo大小超过100的压缩到100,这个可以自己设置,影响logo的大小 if icon_w > 111: icon = icon.resize((111, 111), Image.ANTIALIAS) icon_w, icon_h = icon.size w = int((w - 111) / 2) h = int((h - 111) / 2) else: w = int((w - icon_w) / 2) h = int((h - icon_h) / 2) # 把png背景色转换为白色,避免处理裁剪圆角时出现黑边 w_d = Image.new('RGBA', icon.size, (255, 255, 255)) w_d.paste(icon, (0, 0, icon_w, icon_h), icon) # r = icon_w // 15 # 圆角半径 r = 15 icon = circle_crop_image(w_d, r) # 白底图,15的数值影响白色底图的大小 white_img = Image.new("RGBA", (icon_w + 15, icon_h + 15), (255, 255, 255)) white_img = circle_crop_image(white_img, r) # 灰底图 gray_img = Image.new("RGBA", (icon_w + 2, icon_h + 2), (230, 230, 230)) # 灰底图圆角处理 gray_img = circle_crop_image(gray_img, r) # 粘贴灰底图 white_img.paste(gray_img, (2, 2), gray_img) # 粘贴白图 img.paste(white_img, (w - 2, h - 2), white_img) # 粘贴icon,(w + 5, h + 5)为左上角坐标,数值大小配合white_img的数值大小调整,影响白色边框的宽度 img.paste(icon, (w + 5, h + 5), icon) img_path = 'D:\\xxoo.png' img.save(img_path, quality=100) # img.show() print(img_path) return img_path create_qr_code('www.baidu.com')
三、myqr库生成动态二维码
图片本来是动态的,到这就不懂了,哈哈
from MyQR import myqr def get_qrcode(dir): img_path = 'D:\\xxoo.png'print(img_path) myqr.run(words=dir, # words中填写链接或者文本内容 version=3, # 控制二维码大小 1~40,建议不要超过5,否则生成时间太长 level='H', # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高 picture='log/wechat_files/111.gif', # 背景图片,格式可以是.jpg, .png, .bmp, .gif colorized=True, # 可以使产生的图片由黑白(False)变为彩色(True)的 contrast=1.3, # 用以调节图片的对比度,1.0 表示原始图片,更小的值表示更低对比度,更大反之。默认为1.0。 brightness=1.3, # 用来调节图片的亮度 save_dir='log/wechat_files/',) # 保存目录 # get_qrcode('http://www.baidu.com')
下面来个骚的,效果自己去看吧,哈哈,泡妹子神器:
from MyQR import myqr def get_qrcode(dir): myqr.run(words=dir, # words中填写链接 version=3, # 控制二维码大小 1~40,建议不要超过5,否则生成时间太长 level='H', # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高 picture='timg.gif', # 你想放的动态图片path,网上下载就好了, colorized=True, # 可以使产生的图片由黑白(False)变为彩色(True)的 contrast=1.3, # 用以调节图片的对比度,1.0 表示原始图片,更小的值表示更低对比度,更大反之。默认为1.0。 brightness=1.3, # 用来调节图片的亮度 save_dir='log/wechat_files/',) # 保存目录 get_qrcode('https://a.scene.eprezi.com/s/XteInz0v?adpop=1')
参考:
https://www.cnblogs.com/drewgg/p/12762053.html
https://www.cnblogs.com/small-bud/p/12381887.html