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())
说明
-
首先需要安装两个包
qrcode
和pillow
(image
)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
-
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
,是相关标准规定的最小值) -
使用
io
模块把图片数据保存到内存中buf = io.BytesIO() img.save(buf,format='PNG')
如果要保存到本地文件,可以直接传递文件名,如下所示
buf = io.BytesIO() img.save('test.png',format='PNG')
-
然后使用
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()
-
因为
base64
只负责生成 base64 进制图片,并不会添加data:image
头,所以我们需要自己添加b64img = 'data:image/png;base64,' + heximage.decode()
-
然后我们就可以在
flask
或者tornado
或者django
的模板中愉快的使用了<img src="{{b64img}}"/>
目前尚无回复