Python Flask+Qrcode实现在线动态二维码生成

道锋潜鳞
2021-02-09 / 0 评论 / 83 阅读 / 正在检测是否收录...

代码如下:

from PIL import Image
import qrcode
from io import BytesIO
from flask import Flask, send_file, jsonify, request, Response, json
import sys
import base64
import random
import json
#定义库区块


app = Flask(__name__)


status_base64 = {}  #返回状态码json源字典体

#二维码创建路由1
@app.route("/api/QRcode/create/", methods = ["GET", "POST"])
def code_share():
    try:
        #尝试执行下方代码,判断请求主体的base64编码是否解码异常若异常则执行except区块的代码
        if request.method=='GET':
            url64 = request.args.get("url") or "aHR0cHM6Ly9iLjRsMi5jbi8="#get获取URL参数
            iconm = request.args.get("icon") or "logo"#GET获取logo参数
            
        else:
            url64 = request.form.get("url") or "aHR0cHM6Ly9iLjRsMi5jbi8="#POST获取URL参数
            iconm = request.form.get("icon") or "logo"#POST获取logo参数
        
        url = base64.b64decode(url64).decode("utf-8") #转化url参数
    except Exception as e:
        #若检测到处理异常,则转换返回模式变为json,返回相关错误的消息
        status_base64["status"] = "error"
        status_base64["code"] = 1
        status_base64["Msg"] = str(e)
        return Response(json.dumps(status_base64), mimetype='application/json')
    else:
        #若前方try执行正确无异常,则执行生成操作返回数据
        return make_code(url,iconm)
    
#生成器函数
def make_code(url,iconm):
    qr = qrcode.QRCode(version=8, error_correction=3, box_size=8, border=4)
    qr.add_data(url)
    qr.make(fit=True)
    img = qr.make_image()#初步生成
    img = img.convert("RGBA")
    icon = Image.open("res/" + iconm +".png")#获取logo图片数据
    img_w, img_h = img.size
    factor = 4
    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
    icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
    w = int((img_w - icon_w)/2)
    h = int((img_h - icon_h)/2)
    icon = icon.convert("RGBA")
    img.paste(icon, (w, h), icon)
    # img.show()
    byte_io = BytesIO()
    img.save(byte_io, 'PNG')#加载图片流
    byte_io.seek(0)
    return send_file(byte_io, mimetype='image/png')#返回数据流中的图片

if __name__ == '__main__':
    app.run(host="0.0.0.0",port=8080,threaded=True)

介绍

  • QR Code码是由日本于1994年9月研制的一-种矩阵二维码符号,它具有一维条码及其它二 维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。
  • qrcode模块是Github_上的一-个开源项目,提供了生成二维码的接口。qrcode默认使用PIL库用于生成图像。由于生成qrcode图片需要依赖Python的图像库,所以需要先安装Python图像库PIL(Python Imaging Library)。

QRCode二维码版本展示

  • QR码符号共有40种规格,分别为版本1、版本....版本40版本1的规格为21模块x21模块,版本2为25模块x25模块,以此类推,每一版本符号比前一版本每边增加4个模块,直到版本40,规格为177模块X177模块。其中最高版本40可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。由于其高密度编码,信息容量大,所以被广泛采用。

QRCode方法

qrcode.QRCode(
version=1,
error_ correction=qrcode.ERROR_ CORRECT_ _L, 
box_ size=10,
border=4,
image_ factory=None,
mask_ pattern=None)

  • 参数:

* error_ correction:控制二维码纠错级别。
* ERROR_ CORRECT_ _L:大约7%或者更少的错误会被更正。
* ERROR_ CORRECT_ _M:默认值,大约15%或者更少的错误会被更正。
* ERROR_ CORRECT_ Q:大约25%或者更少的错误会被更正。
* ERROR_ CORRECT_ H:大约30%或者更少的错误会被更正。
* box_ size: 控制二维码中每个格子的像素数,默认为10。
* border:控制二维码四周留白包含的格子数,默认为4。
* image_ factory: 选择生成图片的形式,默认为PIL图像。
* mask_ pattern: 选择生成图片的的掩模。

常用函数

  • add_ _data(str,optimize=20):添加要转换的文字到data参数; 如果使用了optimize优化参数,数据将被拆分为多个块来进行优化,以找到一个长度至少为这个值的足够简洁的方式来生成二维码。设置为"0”以避免优化。
  • make(fit=True):当fit参数为真或者没有给出version参数时,将会调用best_ fit方法来找到适合数据的最小尺寸。
  • make_ image(ill color=None, back_ color=None,image_ factory=None):创建二维码的图像并返回,默认为PIL图像。

使用

如前代码,运行后访问url

参数为url可传入文本,url等

0

评论 (0)

取消