qrcode模块里包含:Qrcode类
调用Qrcode类时,首先实例化对象
QR Code码是由日本于1994年9月研制的一-种矩阵二维码符号,它具有一维条码及其它二 维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。
依赖于
qrcode模块是Github_上的一-个开源项目,提供了生成二维码的接口。qrcode默认使用PIL库用于生成图像。由于生成qrcode图片需要依赖Python的图像库,所以需要先安装Python图像库PIL(Python Imaging Library)。
二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。它能将数字、英文字母、汉字、日文字母、特殊符号(如空格,%,/ 等)、二进制等信息记录到一个正方形的图片中。
QR码符号共有40种规格,分别为版本1、版本…版本40版本1的规格为21模块x21模块,版本2为25模块x25模块,以此类推,每一版本符号比前一版本每边增加4个模块,直到版本40,规格为177模块X177模块。其中最高版本40可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。由于其高密度编码,信息容量大,所以被广泛采用。
# 实例化 :
qr = qrcode.Qrcode(version=None,
error_correction=constants.ERROR_CORRECT_M,
box_size=10, border=4,
image_factory=None,
mask_pattern=None)
Qrcode类构造函数
def __init__(self, version=None,
error_correction=constants.ERROR_CORRECT_M,
box_size=10, border=4,
image_factory=None,
mask_pattern=None):
_check_box_size(box_size)
self.version = version and int(version)
self.error_correction = int(error_correction)
self.box_size = int(box_size)
# Spec says border should be at least four boxes wide, but allow for
# any (e.g. for producing printable QR codes).
self.border = int(border)
_check_mask_pattern(mask_pattern)
self.mask_pattern = mask_pattern
self.image_factory = image_factory
if image_factory is not None:
assert issubclass(image_factory, BaseImage)
self.clear()
参数详解:
一个整数,范围为1到40,表示二维码的大小(最小值是1,是个12×12的矩阵),如果想让程序自动生成,将值设置为 None 并使用 fit=True 参数即可
二维码的纠错范围,可以选择4个常量:
1. ERROR_CORRECT_L 7%以下的错误会被纠正
2. ERROR_CORRECT_M (default) 15%以下的错误会被纠正
3. ERROR_CORRECT_Q 25 %以下的错误会被纠正
4. ERROR_CORRECT_H. 30%以下的错误会被纠正
控制二维码中每个小格子包含的像素数
控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值)
选择生成图片的形式,默认为PIL图像
选择生成图片的的掩模
fit=True自动生成大小适中的二维码,当version=None时fit=True才起作用
optimize=20 :优化:数据将被分割成多个块,通过找到至少这个长度的压缩模式来优化QR大小。
设置为“0”以完全避免优化
仅使用TTY颜色输出二维码。如果数据尚未编译,请先进行编译。
从二维码数据制作图像。如果数据还没有编译好,就先做创建二维码的图像并返回,
默认为 PIL 图像。如果要让二维码有颜色,可以在这里设置
清空数据
返回二维码数组
make_image()生成二维码时,默认设置的是PIL图像工具
if image_factory is None:
# Use PIL by default
from qrcode.image.pil import PilImage
image_factory = PilImage
qrcode可以生成三种不同的svg图像,一种是用路径表示的svg,一种是用矩形集合表示的完整svg文件,还有一种是用矩形集合表示的svg片段。第一种用路径表示的svg其实就是矢量图,可以在图像放大的时候可以保持图片质量,而另外两种可能会在格子之间出现空隙。
这三种分别对应了svg.py中的SvgPathImage、SvgImage和SvgFragmentImage类。在调用qrcode.make函数或者实例化QRCode时当作image_factory参数的值传入就可以了。
import qrcode.image.svg
if method == 'basic': # Simple factory, just a set of rects.
factory = qrcode.image.svg.SvgImage
elif method == 'fragment': # Fragment factory (also just a set of rects)
factory = qrcode.image.svg.SvgFragmentImage
else:
# Combined path factory, fixes white space that may occur when zooming
factory = qrcode.image.svg.SvgPathImage
img = qrcode.make('Some data here', image_factory=factory) # 通过make函数二维码,二make函数内部封装生成二维码make_image(),记住make是一个函数,不是Qrcode类的方法
# 'Some data here':是相当于add_data()
执行命令安装pymaging相关模块:
pip install git+git://github.com/ojii/pymaging.git#egg=pymaging
pip install git+git://github.com/ojii/pymaging-png.git#egg=pymaging-png
然后给image_factor参数传入qrcode.image.pure.PymagingImage就可以生成PNG图片了。
import qrcode from qrcode.image.pure
import PymagingImage
img = qrcode.make('Some data here', image_factory=PymagingImage)
这是作者推荐的方式,但是我个人认为,完全没有必要这么麻烦,直接用默认的 PIL 就可以获取 PNG 图片了,例子看下文。
make函数:实际上就是在内部调用了QRCode(要转换的文本).make_image(),最后(默认)返回了一个PIL图像对象。
# 显示图片qrcode.make("hello world!").show()
保存 PNG 图片qrcode.make("hello world!").save('hello.png')
扩展:
1、qrcode.make(“hello world!”) 是模块的函数
2、qr.make(fit=True) 只是Qrcode类的一个方法 ,不要混合这两个make
make函数
def make(data=None, **kwargs):
qr = QRCode(**kwargs)
qr.add_data(data)
return qr.make_image()
# 1、**kwargs 可以为version,error_correction,box_size=10, border=4,image_factory=None,mask_pattern=None
# 2、make(data=None, **kwargs)函数内部调用的就是QRCode()实例化的对象
qr.make()是Qrcode类的方法
qr = qrcode.Qrcode(version=None,
error_correction=constants.ERROR_CORRECT_M,
box_size=10, border=4,
image_factory=None,
mask_pattern=None)
qr.make(fit=True) #当version为None, 自动生成大小适中的二维码
import qrcode
qr = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_L,
border=4,
box_size=10
)
img = qrcode.make('ssssssssssssss',version=4,border=4,box_size=12)
img.save('path.jpg') # 以文件形式保存图片(参数:为文件路径)
print(img,type(img))
#
print(img.box_size)
# 12 # 二维码一个格最小大小(像素)
print(img.width)
# 33
print(img.size)
# (492, 492) img对象(图片)的长和宽