产生 QRCode
这篇文章会介绍使用 Python 的 qrcode 第三方函数库,快速将文字或网址,转换成 QRCode 图片 ( 支援 SVG 格式 ),也会运用相关的 API,快速产生个性化的 QRCode ( 特殊造型、渐层色、背景图、logo 图示 )。
快速导览:
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
安装 qrcode 函数库
输入下列指令,安装 qrcode 函数库 ( 依据每个人的作业环境不同,可使用 pip 或 pip3 )。
!pip install qrcode
还要额外安装与 Pillow 有关的模组。
!pip install "qrcode[pil]"
实作过程中会进行图片操作,输入下列指令,额外安装 Pillow 函数库 ( Colab 和 Anaconda 已经内建,不用额外安装 )。
!pip install Pillow
快速产生 QRCode
加载 qrcode 函数库之后,使用 make 方法,输入需要转换成 qrcode 的内容,就会产生 qrcode 图片,qrcode 函数库内建 Pillow 的方法,因此使用 save 方法就能储存图片 ( 可存成 jpg、png、gif ),如果是本机环境,也可使用 show 的方式预览图片。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
import qrcode
img = qrcode.make('https://steam.oxxostudio.tw') # 要轉換成 QRCode 的文字
img.show() # 顯示圖片 ( Colab 不適用 )
img.save('qrcode.png') # 儲存圖片
产生 QRCode 进阶设定
透过 qrcode.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。 |
使用 qrcode.QRCode 必须额外搭配 add_data、make 和 make_image 三个方法,参考下方的程序码,执行后会产生一个比较小的 QRCode 以及一个比较大的 QRCode。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
import qrcode
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4
)
qr.add_data('https://steam.oxxostudio.tw') # 要轉換成 QRCode 的文字
qr.make(fit=True) # 根據參數製作為 QRCode 物件
img = qr.make_image() # 產生 QRCode 圖片
img.show() # 顯示圖片 ( Colab 不適用 )
img.save('qrcode.png') # 儲存圖片
设定 make_image 的参数,就能改变 QRCode 输出的颜色,fill_color 表示 QRCode 主体颜色,back_color 是背景色 ( 支援十六进制色码,例如 #ff0000 是红色 ),如果将前面的程序码加入参数 ( 如下方的程序码 ),执行后会产生一个黑底红色的 QRCode。
img = qr.make_image(fill_color="red", back_color="black")
QRCode 输出为 SVG
下方的程序使用“快速产生 QRCode”的方法,额外加载 qrcode.image.svg,在 make 里新增 image_factory=qrcode.image.svg.SvgPathImage 参数,就能产生 SVG 格式的 QRCode 图片。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
import qrcode
import qrcode.image.svg
img = qrcode.make('https://steam.oxxostudio.tw', image_factory=qrcode.image.svg.SvgPathImage) # 要轉換成 QRCode 的文字
#img.show() # SVG 無法使用
img.save('qrcode.svg') # 儲存圖片,注意副檔名為 SVG
下方的程序使用“进阶设定”的方式产生 QRcode,额外加载 qrcode.image.svg,在 qrcode.QRCode 里新增 image_factory=qrcode.image.svg.SvgPathImage 参数,就能产生 SVG 格式的 QRCode 图片 ( 如果是 SVG 格式图片无法改变颜色 )。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
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('https://steam.oxxostudio.tw')
qr.make(fit=True)
img = qr.make_image()
#img.show() # SVG 無法使用
img.save('qrcode.svg') # 儲存圖片,注意副檔名為 SVG
产生个性化 QRCode
在版本 7.2 以上的 qrcode 函数库,有提产生供个性化 QRCode 的功能,提供额外五种特殊造型的 QRCode:
| 造型名称 | 说明 |
|---|---|
| SquareModuleDrawer() | 默认方格 |
| GappedSquareModuleDrawer() | 小方格 |
| CircleModuleDrawer() | 圆点 |
| RoundedModuleDrawer() | 圆角方格 |
| VerticalBarsDrawer() | 直线 |
| HorizontalBarsDrawer() | 横线 |
产生个性化 QRCode 需要额外加载 StyledPilImage 和造型模组,加载后在 make_image 方法中进行设定,就能产生个性化的 QRCode ( 个性化 QRCode 无法使用 fill_color 和 back_color,且不支援 SVG 格式输出 ),下方的程序码执行后,会产生六种造型的 QRCode。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
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('https://steam.oxxostudio.tw')
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())
img1.save('qrcode1.png')
img2.save('qrcode2.png')
img3.save('qrcode3.png')
img4.save('qrcode4.png')
img5.save('qrcode5.png')
img6.save('qrcode6.png')
QRCode 加入渐层色或背景图
在版本 7.2 以上的 qrcode 函数库,额外加载 StyledPilImage 和渐层色模组,就能替 QRCode 加入漂亮的渐层颜色,共有六种填色方式,颜色参数使用 tuple 格式数值为 0~255 色码,例如红色 (255,0,0),绿色 (0,255,0),蓝色 (0,0,255):
| 渐层填色方式 | 参数 | 说明 |
|---|---|---|
| SolidFillColorMask() | (背景、填充) | 默认填满颜色 |
| RadialGradiantColorMask() | (背景、中心、四周) | 圆形放射渐层 |
| SquareGradiantColorMask() | (背景、中心、四周) | 方形放射渐层 |
| VerticalGradiantColorMask() | (背景、上方、下方) | 垂直渐层 |
| HorizontalGradiantColorMask() | (背景、左侧、右侧) | 水平渐层 |
| ImageColorMask() | (背景、图片位址) | 图片填充 |
下方的程序码执行后,会产生一个红色 QRCode、一个背景填色的 QRCode 和四个具有红色蓝色渐层色的 QRCode。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
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('https://steam.oxxostudio.tw')
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),'mona.jpg'), module_drawer=RoundedModuleDrawer())
img1.save('qrcode1.png')
img2.save('qrcode2.png')
img3.save('qrcode3.png')
img4.save('qrcode4.png')
img5.save('qrcode5.png')
img6.save('qrcode6.png')
QRCode 加入 logo 或图片
额外加载 StyledPilImage 模组后,可以使用 embeded_image_path 在 QRCode 的中心加上 logo 图示或图片,加入的图片会被压缩成正方形,下方的例子会在 QRCode 的中心加入一个蒙娜丽莎的头像。
注意,如果要加入图片,容错率必须设定 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('https://steam.oxxostudio.tw')
qr.make(fit=True)
img = qr.make_image(image_factory=StyledPilImage, embeded_image_path='mona.jpg')
img.save('qrcode.png')
参考数据
微信扫码关注
抖音扫码关注