首页Python【Python计算生态】q...

【Python计算生态】qrcode——二维码生成库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

qrcodePython中一个用于生成二维码的第三方库,它可以方便地将文本、链接等信息编码为二维码图像,并且支持多种自定义选项和高级功能。
  • 安装:
标准安装使用pypng生成PNG文件,也可以直接在控制台渲染QR Code。标准安装方法如下:
pip install qrcode
如果需要更多图像功能,可以安装带有pil依赖的qrcode,这样会安装Pillow库,用于生成图像:
pip install "qrcode[pil]"
  • 使用方法:
  • 命令行使用:
安装后,可以使用qr脚本从命令行生成QR Code
qr "Some text" > test.png
  • Python使用:
Python中,可以使用make()函数快速生成简单的二维码:
import qrcode
img = qrcode.make('Some data here')
type(img)  # qrcode.image.pil.PilImage
img.save("some_file.png")


02
QRCode对象

  • 2.1 QRCode类:

如果需要自定义二维码参数,可以使用QRCode类。

import qrcode

# 要编码的信息
data = "https://www.mizhushare.com/"

# 创建 QRCode 对象
qr = qrcode.QRCode(
    version=1,  # 二维码的版本
    error_correction=qrcode.constants.ERROR_CORRECT_L,  # 纠错级别
    box_size=10,  # 每个小方格的像素大小
    border=4,  # 二维码周围的边框大小
)

# 添加数据到 QRCode 对象
qr.add_data(data)
qr.make(fit=True)

# 创建二维码图像,并设置前景色和背景色
img = qr.make_image(fill_color="red", back_color="black")

# 保存二维码图像
img.save("qrcode.png")

print("二维码已生成并保存为 qrcode.png")
# 显示二维码图像
img.show()

参数说明:

  • version参数:是一个从 1 到 40 的整数,用于控制QR Code的大小(最小版本 1 是一个 21×21 的矩阵)。可以将version置为1,并在生成 QR Code 时设置参数 fit=True 自动确定版本。

  • error_correction参数:用于控制 QR Code 的容错能力,容错能力越强,二维码的尺寸和复杂度越高。qrcode提供以下四个常量:ERROR_CORRECT_L(容错率约7%)、ERROR_CORRECT_M(容错率约15%,默认值)、ERROR_CORRECT_Q(容错率约25%)、ERROR_CORRECT_H(容错率约30%)。
  • box_size参数:控制QR Code中每个“盒子”的像素大小。增大此值会使二维码图像更大。
  • border参数:控制QR Code边框的宽度,默认值为4,单位是box_size。增大此值会在二维码周围添加更多空白边框。
  • fill_colorback_color参数:可以设置QR Code的前景色和背景色。

add_data()方法用于向当前QR对象添加数据。要替换同一对象中以前的内容来添加新数据,首先要使用clear()方法:

import qrcode
qr = qrcode.QRCode()
qr.add_data('Some data')
img = qr.make_image()
# 清空之前添加的数据
qr.clear()
qr.add_data('New data')
other_img = qr.make_image()


2.2 将生成的二维码以 ASCII 字符的形式输出:

利用qrcode库生成包含指定文本的二维码,并将其以ASCII字符形式输出显示。

# io模块提供了处理输入输出流的工具,本次主要使用其中的StringIO类,它可以创建一个内存中的文件对象,用于临时存储文本数据
import io
import qrcode

qr = qrcode.QRCode()
qr.add_data("Some text")

# 创建一个 StringIO 对象 f
# 它相当于一个内存中的文本文件,可以像操作文件一样对其进行读写操作,但数据存储在内存中而不是磁盘上
f = io.StringIO()
# 调用 QRCode 对象的 print_ascii 方法,该方法的作用是将生成的二维码以 ASCII 字符的形式输出
# out参数指定输出的目标位置,这里将输出结果写入到之前创建的 StringIO 对象 f 中
qr.print_ascii(out=f)
# 将文件指针移动到 StringIO 对象 f 的起始位置
f.seek(0)
# 调用 StringIO 对象 f 的 read 方法,读取其中存储的 ASCII 字符形式的二维码数据,并使用 print 函数将其打印输出到控制台
print(f.read())


03
图像工厂

可以将QR Code编码为SVG,或者使用纯Python图像处理器编码为PNG图像。

  • 3.1 SVG:

如果需要高质量打印,可以生成 SVG 格式的二维码:

  • 从命令行生成 SVG:

qr --factory=svg-path "Some text" > test.svg
qr --factory=svg "Some text" > test.svg
qr --factory=svg-fragment "Some text" > test.svg
  • 在 Python 中生成 SVG:

qrcode.image.svg模块中包含以下五个不同SVG二维码图像工厂类:

  • qrcode.image.svg.SvgImage:这是最基本的SVG图像工厂,生成一个简单的SVG图像,使用一组矩形来表示QR Code

  • qrcode.image.svg.SvgFragmentImage:生成SVG片段,而不是完整的SVG文件。这在某些嵌入场景中非常有用。

  • qrcode.image.svg.SvgPathImage:这是推荐的SVG图像工厂,它将 QR Code的模块组合为一个路径(<path> 元素),从而在缩放时避免空白问题。

  • qrcode.image.svg.SvgFillImage:与SvgImage类似,但会填充SVG的背景为白色。

  • qrcode.image.svg.SvgPathFillImage:与SvgPathImage类似,但会填充SVG的背景为白色。

import qrcode
import qrcode.image.svg

# 要编码的信息
data = "https://www.mizhushare.com/"

# 生成SVG格式的二维码,并指定图像工厂
img = qrcode.make(data , image_factory=factory_Path)

# 保存二维码图像
img.save('qr.svg')

QRCode.make_image()方法会将额外的关键字参数传递到底层的 ElementTree XML库, 这有助于调整生成的SVG的根元素:

import qrcode

data = "https://www.mizhushare.com/"

qr = qrcode.QRCode(image_factory=qrcode.image.svg.SvgPathImage)
qr.add_data(data)
qr.make(fit=True)

# 为生成的 SVG 图像添加了一个 CSS 类名 some-css-class
img = qr.make_image(attrib={'class''some-css-class'})

# 保存二维码图像
img.save('qr2.svg')

可以使用to_string()SVG图像转换为字符串:

img.to_string(encoding='unicode')


  • 3.2 纯Python PNG:

如果未安装Pillow,默认图像工厂将是一个使用pypng的纯Python PNG 编码器。

  • 在命令行中使用该工厂生成 PNG

qr --factory=png "Some text" > PyPNGImage_1.png
  • 在 Python 中生成 PNG

import qrcode
from qrcode.image.pure import PyPNGImage
img = qrcode.make('Some data here', image_factory=PyPNGImage)
img.save("PyPNGImage_2.png")


  • 3.3 自定义样式图像:

自定义样式功能仅在版本>=7.2 中可用(SVG 样式图像需要 7.4)。

可以通过StyledPilImage或标准SVG图像工厂为QR Code添加样式。这些工厂接受可选的module_drawer参数,用于控制QR Code的形状:
  • SquareModuleDrawer()
  • GappedsquareModuleDrawer()
  • CircleModuleDrawer()
  • RoundedModuleDrawer()

  • VerticalBarsDrawer()

  • HorizontalBarsDrawer()

需要注意的是,这些QR Code可能无法被所有读取器识别,因此建议进行一些实验,并将纠错级别设置为高(尤其是嵌入图像时)。

在 SVG 中,可以使用以下模块绘制器:

  • SvgSquareDrawer

  • SvgCircleDrawer

  • SvgPathSquareDrawer

  • SvgPathCircleDrawer

它们都接受一个size_ratio参数,通过将该参数小于默认的Decimal(1),可实现 “间隙 “方形或圆形。

此外,StyledPilImage还接受一个可选的color_mask参数,用于更改QR 代码的颜色:
  • SolidFillColorMask()

  • RadialGradiantColorMask()

  • SquareGradiantColorMask()

  • HorizontalGradiantColorMask()
  • VerticalGradiantColorMask()
  • ImageColorMask()
以及一个可选的embeded_image_path参数,用于在代码中心嵌入图像。

以下是绘制带有圆角、径向渐变和嵌入图像的QR Code 的代码示例:

import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers.pil import RoundedModuleDrawer
from qrcode.image.styles.colormasks import RadialGradiantColorMask

qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data('Some data')

img_1 = qr.make_image(image_factory=StyledPilImage, module_drawer=RoundedModuleDrawer())
img_2 = qr.make_image(image_factory=StyledPilImage, color_mask=RadialGradiantColorMask())
img_3 = qr.make_image(image_factory=StyledPilImage, embeded_image_path="logo.jpg")

import matplotlib.pyplot as plt

# 创建一个包含三个子图的图形
fig, axes = plt.subplots(1, 3, figsize=(15, 5))

# 显示第一张二维码
axes[0].imshow(img_1)
axes[0].axis('off')
axes[0].set_title("RoundedModuleDrawer", fontsize=12) 

# 显示第二张二维码
axes[1].imshow(img_2)
axes[1].axis('off')
axes[1].set_title("RadialGradiantColorMask", fontsize=12) 

# 显示第三张二维码
axes[2].imshow(img_3)
axes[2].axis('off')
axes[2].set_title("embeded_image", fontsize=12) 

# 调整子图布局,增加底部间距以显示标签
plt.subplots_adjust(bottom=0.15)

# 显示图形
plt.show()

生成的二维码效果如下图所示:

更多内容可以前往GitHub页面查看:

https://github.com/lincolnloop/python-qrcode

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments