QArt 是由 Russ Cox 在他个人网站的一篇文章中提出的一种将包含 URL 的二维码与图像结合的方法。
示例图片(来源于 Russ Cox 的文章):
这个库是 QArt 的 Python 实现版本。
pip install pyqart
注:只支持 Python3,请确认你使用的是 python3 版本的 pip。
为便于重用,我将库分成了两部分,一部分是普通二维码生成,另一部分则将 URL 二维码与图像结合。
使用 pyqr
命令行程序,可以创建普通二维码。
pyqr -p 5 -c 102 204 255 "Hello World!" -o qr.png
其中:
-p
参数指定生成的二维码图片中,每个填充点的大小,默认是 3 像素。-c
参数指定填充点的颜色,默认是黑色。背景色默认为白色,可以用-g
参数设定。
如果你想在终端里查看的话,不提供 -o
参数即可:
pyqr "Hello World"
输出如下:
显示效果和你终端的字体有关,我的字体是 Dejavu Sans Mono.
当然,终端只能用于显示比较小的二维码。
有关二维码生成的更多参数和它们的作用请使用 pyqr -h
命令查看。
使用 pyqart
命令行程序创建艺术二维码。(所需时间可能较长,请耐心等待)
使用我的博客网址和 Github 头像来做例子,-v
参数指定二维码的大小。
pyqart -v 8 -c 102 204 255 "http://0v0.link/" photo.jpg -o qart.png
这是我的 Github 头像:
生成的二维码如下,扫描一下就会跳转到我的博客啦:
可能效果不太好,试试使用 -n
参数来随机选取像素点(默认情况下会先处理大片相同颜色的区域):
pyqart -n -c 102 204 255 -v 8 "http://0v0.link/" photo.jpg -o qart-n.png
可能还是不太好?再试试 -y
参数,它通过放弃边缘区域来加强中间区域的逼近效果:
pyqart -y -c 102 204 255 -v 8 "http://0v0.link/" photo.jpg -o qart-y.png
-y
和 -n
参数也可以结合起来使用,不过提升不会很明显。
注意: -y
参数由于只只使用数据块而不使用纠错块,减少了很多很多很多操作,相比没有 -y
参数大概有 30 到 100 倍的速度提升,强烈建议在不需要全图拟合时使用 -y
参数。
另外,使用 -r
参数指定二维码的旋转角度,可以把可控制的数据区变为横向,方便扁长图形处理:
有关 QArt 生成的更多参数和它们的作用请使用 pyqart -h
命令查看。
文档正在编写中。
Python 官网。(此示例使用了 -d 参数,请查看帮助获取更多信息)
Github 首页。
哔哩哔哩。
0.1.0 版本增加了 Halftone 支持,另外也实现了一种结合了 QArt 和 Halftone 的新算法,我暂时命名为 HalfArt。
以下代码展示了输出各种格式的所需参数:
from pyqart import QArtist, QrHalftonePrinter, QrImagePrinter, QrPainter
QR_VERSION = 10
POINT_PIXEL = 3
artist = QArtist('http://www.nankai.edu.cn/', 'example.jpg', QR_VERSION)
painter = QrPainter('http://www.nankai.edu.cn/', QR_VERSION)
artist_data_only = QArtist('http://www.nankai.edu.cn/', 'example.jpg',
QR_VERSION, only_data=True)
# normal
QrImagePrinter.print(painter, path='normal.png', point_width=POINT_PIXEL)
# Halftone
QrHalftonePrinter.print(painter, path='halftone.png', img='example.jpg',
point_width=POINT_PIXEL, colorful=False)
# Halftone colorful
QrHalftonePrinter.print(painter, path='halftone-color.png', img='example.jpg',
point_width=POINT_PIXEL)
# Halftone pixel
QrHalftonePrinter.print(painter, path='halftone-pixel.png', img='example.jpg',
point_width=POINT_PIXEL, colorful=False,
pixelization=True)
# QArt
QrImagePrinter.print(artist, path='qart.png', point_width=POINT_PIXEL)
# QArt data only
QrImagePrinter.print(artist_data_only, path='qart-data-only.png',
point_width=POINT_PIXEL)
# HalfArt
QrHalftonePrinter.print(artist, path='halfart.png', point_width=POINT_PIXEL)
# HalfArt data only
QrHalftonePrinter.print(artist_data_only, path='halfart-data-only.png',
point_width=POINT_PIXEL)
Halftone | Halftone colorful | Halftone pixel |
QArt | QArt data only | |
HalfArt | HalfArt data only |
- 让 QrPainter 能自己决定参数
- Art 部分
- CLI
- 打包
- Halftone 支持
- 自制 HalfArt 方法
- GUI
- 使用 Cython 加快里德所罗门码编码速度
- 文档
- 测试
- Golang: qr by Russ Cox
- Java: qart4j by dieforfree
- 所有一切都源自 Russ Cos 的文章,感谢他。
- 感谢 dieforfree 的 qart4j 项目,它给我提供了很多如何实现 art 部分参考。
- 感谢 thonky.com 的 二维码原理指导 系列文章,非常详细,关于编码和纠错中不懂的地方多亏了它。
- 感谢 Python。
MIT。
参见 LICENSE 文件。