mylogo

退役程序员的茶室 RetiredCoder.cn

← 返回上一页

巧用Python:制作多种样式的二维码

2025-05-04 04:22:06

这一讲我们来看看如何通过Python程序制作多种样式的二维码。

什么是二维码

二维码的存在现在已经融入了我们的日常生活,它可以作为信息的载体,通过扫描来获得它记载的信息,它比一维条码还多了容错机制,即使遮挡了一部分,也有可能得到正确的结果。

引入第三方库qrcode

引入之前,需要先对qrcode进行安装,一般使用的是pip install qrcode这个命令,然后在程序开头引入这个库。

import qrcode

另外,由于涉及到图像处理,可能还需要Pillow库,如果之前没装过,也可以用pip install Pillow命令安装。

使用make()和save()方法生成和保存二维码

在视频例子中,我介绍的是一种生成二维码的简单方式,它是通过调用make()方法生成二维码图像对象并用save()方法保存成图片。

qrimg = qrcode.make(url)qrimg.save('bili.png')

其中url是一个字符串对象,它保存了二维码的实际信息。而save()方法中的参数是保存图片路径信息。

生成更多样式二维码前的准备

视频中的方式生成的是默认样式的二维码,如果要改变,需要用更复杂的方式来实现。

首先,需要先定义一个qrcode库中QRCode类的对象,并在声明时通过构造函数中的参数来控制二维码的大小、容错能力等

qrc = qrcode.QRCode(
    version=1,    
    error_correction=qrcode.constants.ERROR_CORRECT_H,    
    box_size=10,    
    border=4
)

其中verion的值是1到40之间的值来控制二维码的大小,另外改变box_size的值也能影响二维码的大小。

error_correction就是二维码的纠错能力的设定,默认的值是qrcode.constants.ERROR_CORRECT_M,上述代码中,我用的是纠错百分比最高的qrcode.constants.ERROR_CORRECT_H,这是由于在后面的例子中有一个二维码中可以嵌入自定义图片的例子,如果不用最高,可能二维码会无法被识别。

设定了QRCode类对象后,还需要调用add_data()方法将二维码的信息添加给对象qrc:

qrc.add_data(url)

使用make_image()方法生成二维码图像对象

与make()方法不同,make_image()的参数比较复杂,image_factory用来设定使用的图片工厂,这里用到的类是StyledPilImage,参数module_drawer用来设定构成二维码元素的形状,默认的是方形尖角的样式,可以设置成圆点的形状,也可以设置成圆角的形状,这里用到设置成圆角的模式,所以需要在程序开头引入RoundedModuleDrawer。参数color_mask用来设置颜色遮罩,这里用到了色阶式遮罩RadialGradiantColorMask类和图片颜色遮罩ImageColorMask类:

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

在开头引入所需的类后,就可以在make_image()方法里使用了,下面定义了4种样式的二维码,它们在make_image()方法里的第一个参数image_factory值都设定为StyledPilImage。

第一个二维码改变了构成二维码的元素形状,用参数赋值语句:module_drawer=RoundedModuleDrawer()

第二个二维码使用了色阶变化的颜色遮罩,用参数赋值语句:color_mask=RadialGradiantColorMask(back_color=(200,200,255),center_color=(0,255,0),edge_color=(0,0,255)),这里RadialGradiantColorMask中的用参数back_color,center_color,edge_color来影响色阶的颜变化。

第三个二维码用一张图片grass.png作为遮罩,用参数赋值语句:color_mask=ImageColorMask(color_mask_path=‘grass.png’)

第四个二维码嵌入了一张图片,如果希望给二维码加入自定义的logo,可以用这种方式,注意前面纠缠能力的设定要定义为高。这里用参数赋值语句:embeded_image_path=“grass.png”

qrimg = qrc.make_image(image_factory=StyledPilImage, \
module_drawer=RoundedModuleDrawer())
qrimg.save('b1.png')
qrimg.show()
qrimg = qrc.make_image(image_factory=StyledPilImage, \
color_mask=RadialGradiantColorMask(back_color=(200,200,255),\
center_color=(0,255,0),edge_color=(0,0,255)))
qrimg.save('b2.png')
qrimg.show()
qrimg = qrc.make_image(image_factory=StyledPilImage, \
color_mask=ImageColorMask(color_mask_path='grass.png'))
qrimg.save('b3.png')
qrimg.show()
qrimg = qrc.make_image(image_factory=StyledPilImage, \
embeded_image_path="grass.png")
qrimg.save('b4.png')
qrimg.show()

效果展示

Image

本节课完整代码

import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer
from qrcode.image.styles.colormasks import RadialGradiantColorMask
from qrcode.image.styles.colormasks import ImageColorMask
url = 'https://space.bilibili.com/150227122'
qrc = qrcode.QRCode(    
    version=1,    
    error_correction=qrcode.constants.ERROR_CORRECT_H,    
    box_size=10,    
    border=4,)
qrc.add_data(url)
qrimg = qrc.make_image(image_factory=StyledPilImage, \
module_drawer=RoundedModuleDrawer())
qrimg.save('b1.png')
qrimg.show()
qrimg = qrc.make_image(image_factory=StyledPilImage, \
color_mask=RadialGradiantColorMask(back_color=(200,200,255),\
center_color=(0,255,0),edge_color=(0,0,255)))
qrimg.save('b2.png')
qrimg.show()
qrimg = qrc.make_image(image_factory=StyledPilImage, \
color_mask=ImageColorMask(color_mask_path='grass.png'))
qrimg.save('b3.png')
qrimg.show()
qrimg = qrc.make_image(image_factory=StyledPilImage, \
embeded_image_path="grass.png")
qrimg.save('b4.png')
qrimg.show()