当前位置: 首页 > 工具软件 > python-qrcode > 使用案例 >

Python qrcode模块(生成二维码)

龚迪
2023-12-01

一、Qrcode类解释

qrcode模块里包含:Qrcode类
调用Qrcode类时,首先实例化对象

1、QR Codede 由来

QR Code码是由日本于1994年9月研制的一-种矩阵二维码符号,它具有一维条码及其它二 维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。
依赖于
qrcode模块是Github_上的一-个开源项目,提供了生成二维码的接口。qrcode默认使用PIL库用于生成图像。由于生成qrcode图片需要依赖Python的图像库,所以需要先安装Python图像库PIL(Python Imaging Library)。
二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。它能将数字、英文字母、汉字、日文字母、特殊符号(如空格,%,/ 等)、二进制等信息记录到一个正方形的图片中。

2、QRCode二维码版本

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类构造函数及参数含义

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、version=None

 一个整数,范围为1到40,表示二维码的大小(最小值是1,是个12×12的矩阵),如果想让程序自动生成,将值设置为 None 并使用 fit=True 参数即可

2、error_correction=constants.ERROR_CORRECT_M

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

3、box_size=10,

控制二维码中每个小格子包含的像素数

4、border=4

控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值)

5、image_factory=None

选择生成图片的形式,默认为PIL图像

6、mask_pattern=None

选择生成图片的的掩模

三、Qrcode类常用方法

1、qr.make(self, fit=True)

fit=True自动生成大小适中的二维码,当version=None时fit=True才起作用

2、qr.add_data(self, data, optimize=20)

	optimize=20  :优化:数据将被分割成多个块,通过找到至少这个长度的压缩模式来优化QR大小。
设置为“0”以完全避免优化

3、qr.print_tty(self, out=None)

仅使用TTY颜色输出二维码。如果数据尚未编译,请先进行编译。

4、qr.make_image(fillcolor=None, backcolor=None,image_factory=None)

	从二维码数据制作图像。如果数据还没有编译好,就先做创建二维码的图像并返回,
默认为 PIL 图像。如果要让二维码有颜色,可以在这里设置

5、qr.clear()

清空数据

6、qr.get_matrix()

返回二维码数组

四、image_factory参数的详解

make_image()生成二维码时,默认设置的是PIL图像工具

if image_factory is None:
		# Use PIL by default
		from qrcode.image.pil import PilImage
		image_factory = PilImage	

1、生成 SVG 图像

	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()

2、生成 PNG 图像

执行命令安装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)) 
	# <qrcode.image.pil.PilImage object at 0x00000000028EE348> <class 'qrcode.image.pil.PilImage'>
	print(img.box_size)
	# 12  # 二维码一个格最小大小(像素)
	print(img.width)
	# 33
	print(img.size)
	# (492, 492)  img对象(图片)的长和宽
 类似资料: