Python3 qrcode 生成 base64 格式二维码图片

yufei       5 年, 8 月 前       5390

qrcode 的官方 PyPi 地址为 https://pypi.org/project/qrcode/

下面的代码使用 Python3 qrcode 生成 base64 格式二维码图片

import base64
import io

import qrcode

text = 'https://www.baidu.com' 
qr = qrcode.QRCode(     
    version=1,     
    error_correction=qrcode.constants.ERROR_CORRECT_L,     
    box_size=10,     
    border=1, 
)
qr.make(fit=True) 
qr.add_data(text)
img = qr.make_image()

buf = io.BytesIO()
img.save(buf,format='PNG')
image_stream = buf.getvalue()
heximage = base64.b64encode(image_stream)
print('data:image/png;base64,' + heximage.decode())

说明

  1. 首先需要安装两个包 qrcodepillowimage

    pip3 install qrcode image
    

    在 Python3 中,image 包默认就是 pillow

    如果你没法安装 pillow,那么可以换成纯 python 的库

    pip install git+git://github.com/ojii/pymaging.git#egg=pymaging
    pip install git+git://github.com/ojii/pymaging-png.git#egg=pymaging-png
    
  2. qrcode 生成

    最简单的方法,就三句话

    import qrcode
    img = qrcode.make('Some data here')
    img.save('test.png',format='PNG')
    

    如果需要定制,可以使用 qrcode.QRCode 类来生成

    import qrcode
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data('Some data')
    qr.make(fit=True)
    
    img = qr.make_image(fill_color="black", back_color="white")
    

    参数含义

    参数 说明
    version 值为 1~40 的整数,控制二维码的大小(最小值是 1,是个 12×12 的矩阵)
    如果x想让程序自动确定,将值设置为 None 并使用 fit 参数即可。
    error_correction 控制二维码的错误纠正功能。可取值下列4个常量:
    ERROR_CORRECT_L:大约7%或更少的错误能被纠正。
    ERROR_CORRECT_M(默认):大约 15%或更少的错误能被纠正。
    ROR_CORRECT_H:大约30%或更少的错误能被纠正。
    box_size 控制二维码中每个小格子包含的像素数,数值越小,图片越小
    border 控制边框(二维码与图片边界的距离)包含的格子数(最小值和默认为 4,是相关标准规定的最小值)
  3. 使用 io 模块把图片数据保存到内存中

    buf = io.BytesIO()
    img.save(buf,format='PNG')
    

    如果要保存到本地文件,可以直接传递文件名,如下所示

    buf = io.BytesIO()
    img.save('test.png',format='PNG')
    
  4. 然后使用 base64 模块将内存中的二进制转换成 base64 进制

    image_stream = buf.getvalue()
    heximage = base64.b64encode(image_stream)
    

    需要注意的是 heximage 并不是字符串,而是一个 base64 进制的二进制数据,如果用 print() 方法输出,则会是

    b'iVBORw0KGgoAAAANSUhEUgAAAUoAAAFKAQAAAABTUiuoAAAB+ElEQVR4nO2bzY3bMBCFvwkF+EgBW8CWInWwtaYDqZR0IB4NSHg5kJTtJAd7F7IZ7PBgWNR3eMDDkPMDmbhzzT/uJcFRRx111FFHj0StrA6zfjNIHTamuj0eLsDRR9BBkrSA9Osk5h6AIEnSLXqMAEcfQVMJIRvZDNhME2Bm3XMEOHrH6v54FimsBmG14eczBDj6BbeYP84GgEjPEODoJ9yKAhIYdGj+WPL2de38cq2Ocp1HEMSwXH7q9iBJ08u1Oppj6xJCIm1WDsF425V6uVZHS701pg5IZiV5j+ecGJbK63ABjj6ExrPZGFfyITj3wGwdzO8l6WhI6/dF60mYekR6kwGmYdkQ6W2FdJI1otXR2nnqg8zeVzQBkE5i7jeDuO81ovU7o3tOGKQJijODlBPD/NZzwkbQ7Jam3BOs9xZx3d+unsE3g9bYqgmGplgepSVkG92tVtASW9IKRIlBu2+Q90r4vVyro9e9jGHhxiiAQSvuVlto8SOqjrZiyS2AIBsPF+DoA+hldpzbGLlFmLp/oMcIcPQR9DI7nghXpRb7XLIdrY7us2OGZSv/ZjPDT8Km0bnfJyaSIJnHVjNoyQn3dLBUx0A5CaNXx+2g1a18bwVp2hvxQL3Q3K020L9nx7URlQvjKXqfsB3U/KsFRx111FFH/yP0NzXEV1dkM9h6AAAAAElFTkSuQmCC'
    

    还可以使用 type(heximage) 试验一下,输出如下

    <class 'bytes'>
    

    因此需要使用 decode() 方法转换成 str 类型

    heximage.decode()
    
  5. 因为 base64 只负责生成 base64 进制图片,并不会添加 data:image 头,所以我们需要自己添加

    b64img = 'data:image/png;base64,' + heximage.decode()
    
  6. 然后我们就可以在 flask 或者 tornado 或者 django 的模板中愉快的使用了

    <img src="{{b64img}}"/>
    
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.