QRcode(QR码生成器)

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=Truemake() 方法的一个可选参数。默认情况下,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)

根据 QRCode 对象生成二维码

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)

.make_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、联系方式、电子邮件地址等。当生成二维码时,库会将这些数据编码成二维码的模块(黑白方块)。

  1. 文本数据:
data = "Hello, World!"

文本数据

  1. URL:
data = "https://www.example.com"

URL
3. 联系方式:

data = "TEL:+1234567890"

联系方式

  1. 电子邮件地址:
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 = 1

  • version = 5
    version = 5

取值为 None (默认)或者使用 fit = true 参数(默认)时,二维码会自动调整大小。


7.5 error_correction:纠错级别

用于指定二维码的纠错级别的参数。纠错级别决定了二维码图像在受到损坏或污损时可以被恢复的程度。

error_correction = qrcode.constants.<Error_Correct_Level>
  1. ERROR_CORRECT_L:低纠错级别(7%的字码可被容错)
    低纠错级别

  2. ERROR_CORRECT_M:中纠错级别(15%的字码可被容错)
    中纠错级别

  3. ERROR_CORRECT_Q:高纠错级别(25%的字码可被容错)
    高纠错级别

  4. ERROR_CORRECT_H:最高纠错级别(30%的字码可被容错)
    最高纠错级别

纠错级别越高,二维码可以修复的错误越多,但相应地,二维码的容量会减少。


7.6 box_size:模块像素大小

box_size 参数是一个整数,表示每个模块的像素大小。较大的 box_size 值会生成更大的二维码图像,而较小的 box_size 值会生成更小的二维码图像。

请注意,box_size 参数的最终效果还受到输出图像的分辨率和尺寸等因素的影响。根据实际需要,你可以根据具体应用场景和输出要求选择合适的 box_size 值。

  • box_size = 4
    box_size = 4

  • box_size = 8
    box_size = 8


7.7 border:模块边框大小

border 参数是一个整数,表示以模块为单位的边框大小。边框是指围绕二维码图像周围的空白区域,用于增加二维码的可读性和美观性。

边框大小的最终效果取决于输出图像的尺寸和分辨率。你可以根据实际需求和美观性要求选择合适的边框大小。


7.8 image_factory:图片生成器

image_factory 参数用于指定生成二维码图像的工厂类,即图片生成器。

image_factory 参数接受一个实现了 qrcode.image.base.BaseImage 接口的工厂类,用于创建二维码图像的实例。该工厂类负责生成最终的二维码图像对象。

qrcode 库提供了不同的图像工厂类,可以根据需求选择适合的工厂类。常见的工厂类包括:

  1. qrcode.image.pil.PilImage:使用 Pillow 库生成二维码图像。Pillow 是一个广受欢迎的图像处理库,支持多种图像格式和功能。通过使用 PilImage 工厂类,可以生成常见图像格式(如PNG、JPEG等)的二维码图像。
  2. qrcode.image.svg.SvgPathImage:生成 SVG 格式的二维码图像。SVG 是可缩放矢量图形的一种开放标准,可以无损地缩放和编辑。使用 SvgPathImage 工厂类生成的二维码图像以 SVG 格式存储,可以在支持 SVG 的应用程序中进行使用和处理。
  3. 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)

带Logo的二维码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MoRanzhi1203

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值