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

 

posted @ 2020-08-28 11:51  www.pu  Views(1230)  Comments(0Edit  收藏  举报