Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。
本系列将会陆续整理分享一些有趣、有用的第三方库。
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_Ecosystem
-
安装:
pip install qrcode
pip install "qrcode[pil]"
-
使用方法:
-
命令行使用:
qr "Some text" > test.png
-
Python使用:
import qrcode
img = qrcode.make('Some data here')
type(img) # qrcode.image.pil.PilImage
img.save("some_file.png")
-
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_color和back_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())
可以将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)。
-
SquareModuleDrawer(); -
GappedsquareModuleDrawer(); -
CircleModuleDrawer(); -
RoundedModuleDrawer();
-
VerticalBarsDrawer();
-
HorizontalBarsDrawer()。

在 SVG 中,可以使用以下模块绘制器:
-
SvgSquareDrawer
;
-
SvgCircleDrawer
;
-
SvgPathSquareDrawer
;
-
SvgPathCircleDrawer
。
它们都接受一个size_ratio参数,通过将该参数小于默认的Decimal(1),可实现 “间隙 “方形或圆形。
-
SolidFillColorMask();
-
RadialGradiantColorMask();
-
SquareGradiantColorMask();
-
HorizontalGradiantColorMask(); -
VerticalGradiantColorMask(); -
ImageColorMask()。 -
以下是绘制带有圆角、径向渐变和嵌入图像的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


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