Skip to content

Latest commit

 

History

History
230 lines (156 loc) · 7.71 KB

README.zh.md

File metadata and controls

230 lines (156 loc) · 7.71 KB

PyQArt - QArt 的 Python 实现

Readme in English

简介

QArt 是由 Russ Cox 在他个人网站的一篇文章中提出的一种将包含 URL 的二维码与图像结合的方法。

示例图片(来源于 Russ Cox 的文章):

QArt Example

这个库是 QArt 的 Python 实现版本。

安装

pip install pyqart

注:只支持 Python3,请确认你使用的是 python3 版本的 pip。

使用

为便于重用,我将库分成了两部分,一部分是普通二维码生成,另一部分则将 URL 二维码与图像结合。

Qr 部分

使用 pyqr 命令行程序,可以创建普通二维码。

 pyqr -p 5 -c 102 204 255 "Hello World!" -o qr.png

其中:

  • -p 参数指定生成的二维码图片中,每个填充点的大小,默认是 3 像素。
  • -c 参数指定填充点的颜色,默认是黑色。背景色默认为白色,可以用 -g 参数设定。

qr code: hello world

如果你想在终端里查看的话,不提供 -o 参数即可:

pyqr "Hello World"

输出如下:

qr in terminal: hello world

显示效果和你终端的字体有关,我的字体是 Dejavu Sans Mono.

当然,终端只能用于显示比较小的二维码。

有关二维码生成的更多参数和它们的作用请使用 pyqr -h 命令查看。

Art 部分

使用 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 首页。

哔哩哔哩。

Halftone 和 HalfArt 支持

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

TODO

  • 让 QrPainter 能自己决定参数
  • Art 部分
  • CLI
  • 打包
  • Halftone 支持
  • 自制 HalfArt 方法
  • GUI
  • 使用 Cython 加快里德所罗门码编码速度
  • 文档
  • 测试

其他实现版本

致谢

  • 所有一切都源自 Russ Cos 的文章,感谢他。
  • 感谢 dieforfreeqart4j 项目,它给我提供了很多如何实现 art 部分参考。
  • 感谢 thonky.com 的 二维码原理指导 系列文章,非常详细,关于编码和纠错中不懂的地方多亏了它。
  • 感谢 Python。

协议

MIT。

参见 LICENSE 文件。