Python生成二维码QRCode

发布时间 2023-12-25 17:00:23作者: 华小电

qrcode.QRCode

通过 qrcode.QRCode 方法,可以设定二维码的大小、容错率、颜色...等:

参数 说明
box_size 一个方块的边长为几个像素,默认为 10。
border 边框宽度,默认为 4 ( 最小为 4 )。
error_correction 容错率,数值为 ERROR_CORRECT_L ( 7% )、ERROR_CORRECT_M ( 15%,默认 )、ERROR_CORRECT_Q ( 25% )、ERROR_CORRECT_H ( 30% )。
version 尺寸大小 ( 重复排列次数 ),数值为 1~40,默认为 1(21x21的矩阵)。

使用 qrcode.QRCode 必须搭配 add_data、make 和 make_image 三个方法

make_image 能改变 QRCode 输出的颜色,fill_color 表示 QRCode 填充颜色,back_color 是背景色

import qrcode
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4
)
qr.add_data('Python QRCode Test')   # # 要转换的文字
qr.make(fit=True)          # 生成QRCode图像
img = qr.make_image(fill_color="red", back_color="black")      # 产生 QRCode图片
img.show()                 # 显示图片
img.save('qrcode.png')     # 存储图片

QRCode 输出 SVG 格式

需要导入 qrcode.image.svg,在 qrcode.QRCode 或者 make_image() 里加入 image_factory=qrcode.image.svg.SvgPathImage

import qrcode
import qrcode.image.svg
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
    image_factory=qrcode.image.svg.SvgPathImage
)
qr.add_data('Python QRCode Test')
qr.make(fit=True)

img = qr.make_image()
#img.show()               # SVG无法使用
img.save('qrcode.svg')    # 存储图片

个性化 QRCode

版本 7.2 以上的 qrcode ,提供五种个性化造型 QRCode的功能:

名称 说明
SquareModuleDrawer() 默认方格
GappedSquareModuleDrawer() 小方格
CircleModuleDrawer() 圆点
RoundedModuleDrawer() 圆角方格
VerticalBarsDrawer() 竖线
HorizontalBarsDrawer() 横线

個性化 QRCode 需要导入 StyledPilImage 和个性化造型函数,载入后在 make_image 方法中进行设定,就能产生个性化 QRCode,但是个性化 QRCode无法使用 fill_color 和 back_color,且不支持 SVG 格式

import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import VerticalBarsDrawer,RoundedModuleDrawer,HorizontalBarsDrawer,SquareModuleDrawer,GappedSquareModuleDrawer,CircleModuleDrawer

qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4
)
qr.add_data('Python QRCode Test')
qr.make(fit=True)

img1 = qr.make_image(image_factory=StyledPilImage, module_drawer=SquareModuleDrawer())
img2 = qr.make_image(image_factory=StyledPilImage, module_drawer=GappedSquareModuleDrawer())
img3 = qr.make_image(image_factory=StyledPilImage, module_drawer=CircleModuleDrawer())
img4 = qr.make_image(image_factory=StyledPilImage, module_drawer=RoundedModuleDrawer())
img5 = qr.make_image(image_factory=StyledPilImage, module_drawer=VerticalBarsDrawer())
img6 = qr.make_image(image_factory=StyledPilImage, module_drawer=HorizontalBarsDrawer())

QRCode 加入渐进色或背景图片

应用于版本 7.2 以上的 qrcode ,需导入StyledPilImage 和渐进填色函数,就能给QRCode 加入漂亮的渐进颜色,共有六种填色方式,例如红色 (255,0,0),绿色 (0,255,0),蓝色 (0,0,255):

渐进填色方式 参数 说明
SolidFillColorMask() (背景、填充) 默认填满颜色
RadialGradiantColorMask() (背景、中心、四周) 圆形放射渐进
SquareGradiantColorMask() (背景、中心、四周) 方形放射渐进
VerticalGradiantColorMask() (背景、上方、下方) 垂直渐进
HorizontalGradiantColorMask() (背景、左侧、右侧) 水平渐进
ImageColorMask() (背景、图片地址) 图片填充
import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer
from qrcode.image.styles.colormasks import SolidFillColorMask, RadialGradiantColorMask, SquareGradiantColorMask, VerticalGradiantColorMask, HorizontalGradiantColorMask, ImageColorMask

qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4
)
qr.add_data('Python QRCode Test')
qr.make(fit=True)

img1 = qr.make_image(image_factory=StyledPilImage, color_mask=SolidFillColorMask((255,255,255),(255,0,0)), module_drawer=RoundedModuleDrawer())
img2 = qr.make_image(image_factory=StyledPilImage, color_mask=RadialGradiantColorMask((255,255,255),(255,0,0),(0,0,255)), module_drawer=RoundedModuleDrawer())
img3 = qr.make_image(image_factory=StyledPilImage, color_mask=SquareGradiantColorMask((255,255,255),(255,0,0),(0,0,255)), module_drawer=RoundedModuleDrawer())
img4 = qr.make_image(image_factory=StyledPilImage, color_mask=VerticalGradiantColorMask((255,255,255),(255,0,0),(0,0,255)), module_drawer=RoundedModuleDrawer())
img5 = qr.make_image(image_factory=StyledPilImage, color_mask=HorizontalGradiantColorMask((255,255,255),(255,0,0),(0,0,255)), module_drawer=RoundedModuleDrawer())
img6 = qr.make_image(image_factory=StyledPilImage, color_mask=ImageColorMask((255,255,255),'logo.jpg'), module_drawer=RoundedModuleDrawer())


导入StyledPilImage后,可以使用 embeded_image_path 在 QRCode 的中心填加 logo,加入的图片会被压缩成正方形

注意,如果要加入图片,容错率必须设定 ERROR_CORRECT_Q 或 ERROR_CORRECT_H。

import qrcode
from qrcode.image.styledpil import StyledPilImage

qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_Q,
    box_size=10,
    border=4
)
qr.add_data('Python QRCode Test')
qr.make(fit=True)

img = qr.make_image(image_factory=StyledPilImage, embeded_image_path='logo.jpg')
img.save('qrcode.png')