利用qr_code模块生成二维码

2020-05-28  本文已影响0人  Odven
#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import qrcode
from PIL import Image


def generateQrCode(qr_file="qr_file.png", data=None, icon_file=None, C_ratio=None):
    '''
    :param qr_file: 保存生成的二维码图片文件
    :param data: 二维码里面的内容
    :param icon_file: 出现在二维码图片中间的图片
    :param C_ratio: 控制出现在二维码图片中间的图片的大小
    :return: img
    '''
    # 创建QRCode对象
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=10,
        border=3
    )
    # version: 一个整数,范围为1到40,表示二维码的大小(最小值是1,是个12×12 的矩阵),如果想让程序自动生成,将值设置为 None并使用fit = True参数即可。

    # error_correction: 二维码的纠错范围,可以选择4个常量:
    # 1. ERROR_CORRECT_L 7%以下的错误会被纠正
    # 2. ERROR_CORRECT_M (default) 15%以下的错误会被纠正
    # 3. ERROR_CORRECT_Q 25 %以下的错误会被纠正
    # 4. ERROR_CORRECT_H. 30%以下的错误会被纠正

    # box_size: 每个点(方块)中的像素个数

    # border: 二维码距图像外围边框距离,默认为4,而且相关规定最小为4

    # 添加数据
    qr.add_data(data)

    # 填充数据
    qr.make(fit=True)

    # 生成二维码
    img = qr.make_image(fill_color="green", back_color="white")

    # 显示二维码
    # img.show()
    qr_w, qr_h = img.size
    # print(qr_w, qr_h)

    if icon_file is not None:
        # 重做图片大小
        try:
            icon = Image.open(icon_file)
        except Exception as e:
            return e
        if C_ratio is None:
            C_ratio = 5
        ic_w, ic_h = int(qr_w / C_ratio), int(qr_h / C_ratio)
        # print(ic_w, ic_h)
        icon = icon.resize((ic_w, ic_h), Image.ANTIALIAS)

        w, h = int((qr_w - ic_w) / 2), int((qr_h - ic_h) / 2)
        # print(w, h)

        # 添加图片到二维码
        img.paste(icon, (w, h), mask=None)
        # img.show()

    # 保存二维码图片
    img.save(qr_file)
    return img


if __name__ == '__main__':
    qr_file = "dingding.jpg"
    data = "窗前明月光,疑似地上霜。举头望明月,低头思故乡。"
    img = generateQrCode(qr_file=qr_file, data=data, icon_file="d.jpg", C_ratio=3)
    print(img.show())

    img1 = generateQrCode(data="study hard, improve every day. 好好学习天天向上")
    print(img1.show())

    img2 = generateQrCode()
    print(img2.show())
上一篇下一篇

猜你喜欢

热点阅读