QRcode(QR码生成器)
二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave 公司于 1994 年发明。现随着智能手机的普及,已广泛应用于平常生活中,例如商品信息查询、社交好友互动、网络地址访问等等。
qrcode 模块是 Github 上的一个开源项目,提供了生成二维码的接口。qrcode 默认使用PIL库用于生成图像。由于生成 qrcode 图片需要依赖 Python 的图像库,所以需要先安装 Python 图像库 PIL(Python Imaging Library)。
1. 安装与导入
-
安装 qrcode 库
pip install qrcode
-
导入 qrcode 库
import qrcode
2. 生成二维码图像
qrcode.make(data = None, **kwargs)
qrcode 库的顶级函数,是用于快速生成一个二维码图像的简便方式。
data
:要编码为二维码的数据,可以是字符串、URL、联系信息等。**kwargs
:可选参数,用于设置二维码的尺寸、边距、颜色等。- 返回一个
qrcode.image.base.BaseImage
对象,表示生成的二维码图像。
import qrcode
from IPython.display import display
data = 'test'
# 将 data 中的数据进行编码
qr_img = qrcode.make(data)
display(qr_img)
test
3. 创建二维码对象
qrcode.QRCode(*args, **kwds)
用于创建 QRCode
对象的构造函数。
*args
:可变参数列表,用于指定要传递给 QRCode 类的位置参数。**kwds
:关键字参数字典,用于指定要传递给 QRCode 类的关键字参数。
QRCode
对象是 qrcode 库中用于生成二维码的核心对象,它提供了一系列方法用于配置和生成二维码图像。
import qrcode
from IPython.display import display
# ----------------------------------
# 创建了一个 QRCode 对象 qr
qr = qrcode.QRCode(
version = 5, # 二维码的版本为 5
error_correction = qrcode.constants.ERROR_CORRECT_M # 纠错级别为中等
)
# ----------------------------------
# 添加数据到 QRCode 对象
qr.add_data("Hello, QR Code!")
# 二维码的尺寸自动调整
qr.make(fit = True)
# 生成二维码的图像
qr = qr.make_image()
display(qr)
Hello, QR Code!
4. 将编码数据添加到二维码对象中
qrcode.QRCode.add_data(self, data, optimize = 20)
qrcode 库中 QRCode
类的方法之一,用于向二维码对象添加数据。
self
:表示当前的QRCode
对象实例。data
:要添加到二维码中的数据。可以是字符串、URL、字节流等。optimize
:优化参数,用于控制二维码的容错级别和数据编码方式。默认值为 20。
根据提供的数据,add_data()
方法会将数据添加到 QRCode
对象中进行编码。该方法会自动选择生成最小尺寸的二维码,并根据数据内容选择最适合的编码方式。你可以通过调用 make()
方法生成最终的二维码图像。
import qrcode
from IPython.display import display
# 创建 QRCode 对象
qr = qrcode.QRCode(version = 5, error_correction = qrcode.constants.ERROR_CORRECT_M)
# ----------------------------------
# 将要编码的数据添加到 qr 对象中
qr.add_data("Hello, QR Code!")
# ----------------------------------
# 二维码的尺寸自动调整
qr.make(fit = True)
# 生成图像
qr = qr.make_image()
display(qr)
Hello, QR Code!
5. 根据 QRCode 对象生成二维码
qrcode.QRCode.make(self, fit = True)
QRCode
类的方法,用于生成二维码图像,是一种更灵活、可配置的方式,适用于需要对二维码对象进行更多操作和配置的情况。
make()
:在调用qrcode.QRCode.make(fit=True)
时,实际上是通过实例调用了make()
方法。self
参数会自动传递给方法,并表示当前的QRCode
实例。这样,方法内部就可以通过self
来访问实例的属性和方法。self
:表示当前的QRCode
对象实例。fit=True
:make()
方法的一个可选参数。默认情况下,fit
参数设置为True
,表示自动调整二维码的大小以适应数据的长度。如果设置为False
,则二维码的大小将由输入的数据决定,可能会导致二维码的密度较低或者尺寸较大。
注意:其返回值依然是 QRCode 对象
import qrcode
from IPython.display import display
# 创建 QRCode 对象
qr = qrcode.QRCode(version = 5, error_correction = qrcode.constants.ERROR_CORRECT_M)
# 添加数据到 QRCode 对象
data = "Hello, QR Code!"
qr.add_data(data)
# ----------------------------------
# 生成二维码图像,并自动调整尺寸
qr.make(fit = True)
# ----------------------------------
# 生成图像
display(qr)
Hello, QR Code!
6. 将 QRCode 对象转换为二维码图像
qrcode 库中的一个方法,用于将QRCode
对象转换为二维码图像。
qrcode.QRCode.make_image(self, image_factory = None, **kwargs)
self
是一个特殊参数,表示当前的QRCode
对象实例。image_factory
是一个可选参数,用于指定生成二维码图像的工厂,即图像生成器。工厂是一个能够创建图像对象的类或函数。如果未指定image_factory
,则使用默认的工厂,即qrcode.image.pil.PilImage
,它使用Pillow
库来生成二维码图像。**kwargs
是可选的关键字参数,用于传递给图像工厂的额外参数。
6.1 默认的图像工厂
import qrcode
from IPython.display import display
data = "Hello, World!"
qr = qrcode.QRCode()
qr.add_data(data)
qr.make(fit = True)
# ----------------------------------
# 使用默认图像工厂生成图像
image = qr.make_image()
# ----------------------------------
# 显示图像或保存到文件
image.save("qrcode_image.png")
display(image)
Hello, World!
6.2 指定图像工厂
import qrcode
from qrcode.image.pil import PilImage
from qrcode.image.svg import SvgImage
data = "Hello, World!"
qr = qrcode.QRCode()
qr.add_data(data)
qr.make(fit = True)
# 使用PilImage工厂生成PNG格式的图像
image_pil = qr.make_image(image_factory = PilImage)
image_pil.save("qrcode.png")
# 使用SvgImage工厂生成SVG格式的图像
image_svg = qr.make_image(image_factory = SvgImage)
image_svg.save("qrcode.svg")
7. qrcode属性
7.1 data:编码数据
在二维码中,data
是表示要编码成二维码的信息或数据的参数。它可以是一个字符串或字节串,具体取决于库的实现和版本。
data
参数可以包含各种类型的信息,例如文本、URL、联系方式、电子邮件地址等。当生成二维码时,库会将这些数据编码成二维码的模块(黑白方块)。
- 文本数据:
data = "Hello, World!"
- URL:
data = "https://www.example.com"
3. 联系方式:
data = "TEL:+1234567890"
- 电子邮件地址:
data = "mailto:example@example.com"
7.2 **kwargs
**kwargs
是 Python 中用于接收不定数量的关键字参数的语法。在qrcode.QRCode(*args, **kwargs)
的上下文中,**kwargs
表示可以传递任意数量的关键字参数给 QRCode 类的构造函数。
关键字参数是以键值对的形式传递的,其中键表示参数的名称,值表示参数的值。具体的参数名称和取值范围取决于 qrcode 库的实现和版本。
使用**kwargs
语法可以在创建 QRCode 对象时灵活地传递额外的参数,以便对 QRCode 进行自定义配置。例如,可以通过**kwargs
传递尺寸、边距、错误纠正级别等参数来控制生成的二维码的特性。
具体的参数名称和可选取值应该参考 qrcode 库的文档或相关资源来查看。不同的库可能具有不同的参数和选项。
7.3 optimize = 20
优化:数据将被分割成多个块,通过找到至少这个长度的压缩模式来优化 QR 大小。 设置为 “0” 以完全避免优化
7.4 version:二维码版本号
用于指定生成的二维码的版本号。版本号表示二维码的大小和容量,决定了可以存储的数据量。
version
表示生成二维码的尺寸大小,可以接受一个整数值,取值范围是 1 至 40,最小尺寸 1 会生成 21 * 21 的二维码,version
每增加 1,生成的二维码就会添加 4 尺寸,例如 version
是 2,则生成 25 * 25 的二维码。
-
version = 1
-
version = 5
取值为 None
(默认)或者使用 fit = true
参数(默认)时,二维码会自动调整大小。
7.5 error_correction:纠错级别
用于指定二维码的纠错级别的参数。纠错级别决定了二维码图像在受到损坏或污损时可以被恢复的程度。
error_correction = qrcode.constants.<Error_Correct_Level>
-
ERROR_CORRECT_L:低纠错级别(7%的字码可被容错)
-
ERROR_CORRECT_M:中纠错级别(15%的字码可被容错)
-
ERROR_CORRECT_Q:高纠错级别(25%的字码可被容错)
-
ERROR_CORRECT_H:最高纠错级别(30%的字码可被容错)
纠错级别越高,二维码可以修复的错误越多,但相应地,二维码的容量会减少。
7.6 box_size:模块像素大小
box_size
参数是一个整数,表示每个模块的像素大小。较大的 box_size
值会生成更大的二维码图像,而较小的 box_size
值会生成更小的二维码图像。
请注意,
box_size
参数的最终效果还受到输出图像的分辨率和尺寸等因素的影响。根据实际需要,你可以根据具体应用场景和输出要求选择合适的box_size
值。
-
box_size = 4
-
box_size = 8
7.7 border:模块边框大小
border
参数是一个整数,表示以模块为单位的边框大小。边框是指围绕二维码图像周围的空白区域,用于增加二维码的可读性和美观性。
边框大小的最终效果取决于输出图像的尺寸和分辨率。你可以根据实际需求和美观性要求选择合适的边框大小。
7.8 image_factory:图片生成器
image_factory
参数用于指定生成二维码图像的工厂类,即图片生成器。
image_factory
参数接受一个实现了 qrcode.image.base.BaseImage
接口的工厂类,用于创建二维码图像的实例。该工厂类负责生成最终的二维码图像对象。
qrcode
库提供了不同的图像工厂类,可以根据需求选择适合的工厂类。常见的工厂类包括:
qrcode.image.pil.PilImage
:使用 Pillow 库生成二维码图像。Pillow 是一个广受欢迎的图像处理库,支持多种图像格式和功能。通过使用PilImage
工厂类,可以生成常见图像格式(如PNG、JPEG等)的二维码图像。qrcode.image.svg.SvgPathImage
:生成 SVG 格式的二维码图像。SVG 是可缩放矢量图形的一种开放标准,可以无损地缩放和编辑。使用SvgPathImage
工厂类生成的二维码图像以 SVG 格式存储,可以在支持 SVG 的应用程序中进行使用和处理。qrcode.image.pure.PymagingImage
:使用 Pymaging 库生成二维码图像。Pymaging 是一个轻量级的图像处理库,适用于资源受限的环境。通过使用PymagingImage
工厂类,可以在资源有限的环境下生成二维码图像。
7.9 mask_pattern:掩码模式
在二维码中,mask_pattern
是一种掩码模式,用于增加二维码的可读性和容错性。掩码模式是一种在二维码矩阵中应用特定规则的操作,通过改变模块的颜色或形状来减少视觉模式和重复模式,提高识别准确性。
二维码规范定义了八种可用的掩码模式(0至7),每种模式都有不同的规则和算法。选择不同的掩码模式可以改变二维码图案的外观,但不会改变存储的数据。
掩码模式的选择通常由二维码生成库自动处理,以根据数据和版本号选择最佳的掩码模式。这样可以确保生成的二维码具有良好的可读性和容错性。
在 qrcode
库中,默认情况下,掩码模式是自动选择的,即库会自动确定最佳的掩码模式。如果你希望手动指定掩码模式,可以使用 mask_pattern
参数。
请注意,通常情况下,不需要手动指定掩码模式,库会自动为你选择最佳的掩码模式。手动指定掩码模式可能会导致生成的二维码的可读性和容错性下降。建议仅在特定需求下进行手动指定。
7.10 fit = True:是否自适应
在 qrcode
库中,fit
参数用于指定是否将二维码自适应到容器的大小。
默认情况下,fit
参数的值为 True
,即二维码会自动调整大小以适应容器。这意味着生成的二维码图像将根据内容的大小自动调整,以填充整个图像空间,并保持二维码的比例。
如果将 fit
参数设置为 False
,则二维码将按照原始尺寸生成,不会进行任何调整。这意味着二维码可能不会填充整个图像空间,并且可能会显示为较小的尺寸。
7.11 fill_color:前景色
fill_color
参数用于指定生成的二维码图像中模块的填充颜色。模块是组成二维码图案的小方块,可以通过设置 fill_color
参数来改变它们的颜色。
fill_color
参数接受一个表示颜色的字符串,可以使用不同的格式表示颜色,如 RGB(红绿蓝),RGBA(红绿蓝透明度),十六进制等。
image = qr.make_image(fill_color="red", back_color="white")
7.12 back_color:后景色
back_color
参数用于指定生成的二维码图像的背景颜色,即二维码图案外部的填充颜色。
back_color
参数接受一个表示颜色的字符串,可以使用不同的格式表示颜色,如 RGB(红绿蓝),RGBA(红绿蓝透明度),十六进制等。
image = qr.make_image(fill_color="black", back_color="red")
8. 带 Logo 的二维码
import qrcode
from IPython.display import display
from PIL import Image
from PIL import ImageOps
# 创建一个QRCode对象,并设置一些参数
qr = qrcode.QRCode(
# 设置二维码的版本为 2,表示二维码的尺寸为 25 * 25
version = 2,
# 设置纠错水平为H,表示可以纠正30%的错误。
error_correction = qrcode.constants.ERROR_CORRECT_H,
# 设置每个模块的像素大小为 10
box_size = 10,
# 设置二维码边框的宽度为 1 个模块
border = 1
)
# 向二维码对象添加数据,这里添加的是一个网址
qr.add_data('https://github.com/MoRanzhi1203')
# 生成二维码,参数 fit = True 表示根据数据大小自动调整二维码的大小
qr.make(fit = True)
# 生成二维码图片
img = qr.make_image()
# 将图片转换为 RGBA 模式,即带有透明通道的模式
img = img.convert('RGBA')
# 打开一个名为 "head_sculpture.png" 的图像文件,作为 Logo 图像
icon = Image.open('head_sculpture.png').convert('RGB')
# 获取二维码图片的宽度和高度
img_w, img_h = img.size
# 设置缩小比例为 4
factor = 3
# 根据缩小比例计算 Logo 图像的宽度和高度
icon_w, icon_h = img_w // factor, img_h // factor
# 设置 Logo 图像的大小为调整后的宽度和高度,并设置抗锯齿
icon = icon.resize((icon_w, icon_h), Image.LANCZOS)
# 计算 Logo 图像在二维码中的位置
w, h = (img_w - icon_w) // 2, (img_h - icon_h) // 2
# 添加白色边框,设置边框宽度为 9px
icon = ImageOps.expand(icon, border = 9, fill = 'white')
# 将 Logo 图像粘贴到二维码图片中的指定位置
img.paste(icon, (w, h))
# 保存生成的带有 Logo 的二维码图片为 "business_card.png" 文件
img.save("business_card.png")
# 显示带有 Logo 的二维码图片
display(img)