艺术二维码 QArt Codes

2016-08-06 11:38:03 +08:00
 7sDream

介绍

呼,这个很久之前定的目标今天终于差不多算写出来了。

几个月之前发现了一篇文章,是 Russ Cox 写的一篇关于将二维码与图片结合的,我觉得很好玩就准备动手实现。

其实已经有了其他实现的,我记得代码家的微博好像还推荐过,就是这个:https://github.com/dieforfree/qart4j

所以可能很多人都知道这个东西了,我读完 qart4j 的代码( QwQ ,好难读,没注释,而且我还不会 Java )之后开始用 Python 实现我自己的版本,其他的就不多说了,看几个例子:

例子

扫描这个二维码就能打开 V2EX 的首页啦~~

这个是我的 Github

这个是 bilibili

啊对了,需要说明的是,二维码的编码部分也是我自己写的,没有调用库,独立出来了一个 pyqr 的 cli 用于生成普通的二维码,使用效果大概是这样:

当然,也是可以生成图片的,加个 -o 参数就好

pyqart 的 cli 也支持打印在 terminal 里的,例子:

其他的细节看 Readme 吧,pyqr -hpyqart -h 可以查看更多帮助。

原理

因为有点复杂我就不在帖子里说了,涉及到二维码的编码规范和里德所罗门纠错码之类的东西,大家可以暂时看上面那篇算法提出者写的文章,有可能以后我会写一系列文章仔细说明这个实现。

代码

代码在这: https://github.com/7sDream/pyqart

扫描下面这个二维码也可以访问:

我的其他项目可以在 Github 上看……除了那两个最先的 piano 项目,其他的都挺好玩儿的……

额外

额,开学就大四了,然而工作和实习都并没有着落…………

听说阿里今年几乎就不怎么找人,加上它们也没啥 Py 岗……估计是没戏了。 腾讯扔了个简历至今没回应。 网易那个笔试简直了……算法题死活交不上,最后放弃了

未来迷茫中…………

目前座标天津,大四一年准备尽量出去实习吧,有没有什么北京的公司招 Py 实习的,可以联系一下。还有就是毕业以后的工作,有没有公司要的?

以上,谢谢阅读。

22663 次点击
所在节点    Python
102 条回复
7sDream
2016-08-06 20:18:45 +08:00
@scola

恩,看懂那篇论文确实需要一些基础知识。

首先要搞懂二维码的生成原理,我推荐 coolshell 的[这篇文章]( http://coolshell.cn/articles/10590.html) 看完之后再去看 QArt 那篇论文应该能把前半部分(到 Gauss-Jordan Elimination 这一节之前)看懂。

后面的部分是一些数学知识,有点难度,包括多项式除法,伽罗华域,里德所罗门码,向量空间,基,行列式变换之类的知识。

这一段东西我是网上各种搜索的,现在一时也找不全之前看的了,但是[这一篇]( http://netclass.csu.edu.cn/NCourse/hep104/course/content.html)是我看的里面讲的比较清楚的。读第 16.2 这一节就差不多了。

然后再去看 QArt 文章 Gauss-Jordan Elimination 和之后部分,应该差不多能把原理弄懂了。

至于实现的时候我推荐[这个网站]( http://www.thonky.com/qr-code-tutorial/),这个网站一步一步的教你怎么弄出一个二维码。然后你还需要一个二维码的标准。因为我英文不太好,我是 ISO:18004 和 GB/T 18284 一起看的,这两篇标准都能 Google 到我就不发了。

另外强烈建议还是阅读一下别人的实现,一边看标准一边看代码可以互相参考,便于理解。

我代码里 pyqart.qr 这一部分是一个基本上完整的二维码生成器, data 模块是数据编码, ec 模块是生成纠错码, args 是二维码的参数, painter.canvas 生成二维码的骨架, painter.painter 的作用是把 canvas 、 data 、 ec 三部分组合起来,最后交给 printer 里的各种生成器输出二维码。 pyqart.art 里的 QrArtist 里的 bis 函数是 QArt 的关键算法。我代码的架构大概就是这样了,你可以读读以做参考。(我代码也没注释的,可能也有点难读,你可以和 qart4j 结合起来读)
7sDream
2016-08-06 20:25:42 +08:00
@scola

由于回复的时候输入法有点问题……所以链接都 boom 了。我刚刚把要用到的链接都 append 了一下,可以去那里看。
imeoer
2016-08-06 20:30:02 +08:00
太赞啦,大概试了几次 url 没有扫出来,我再试试
7sDream
2016-08-06 20:33:38 +08:00
@imeoer

咦~不会吧,我用微信和 QQ 都试过,成功率几乎都是 100% 丫~
imeoer
2016-08-06 20:40:40 +08:00
@7sDream 哈哈,试了黑色能完美识别,示例的淡蓝色一直不行(微信 /QQ )
7sDream
2016-08-06 20:46:33 +08:00
@imeoer

确实, QQ 试有个蓝色的一直不行…… =,=

看来必须得放弃我喜爱的天依蓝了……我去换个好识别的颜色~
imeoer
2016-08-06 20:54:44 +08:00
@7sDream 加油 lz ,喜欢写这么有意思的项目工作肯定没问题~
zander
2016-08-06 21:03:07 +08:00
分享一些更艺术的。



都是 TGFC 一个网友做的,接受定制服务。
7sDream
2016-08-06 21:04:27 +08:00
@imeoer

我试了一下, QQ 扫描二维码的功能好渣呀……比微信差了一大截……

虽然我试了下,换成深色系的 QQ 的识别成功率也会变高很多……但我决定还是算了,我就喜欢蓝色~

嘻,谢谢鼓励~
7sDream
2016-08-06 21:05:48 +08:00
@zander

哇!这好酷阿!

不过这些估计得用设计软件对每个二维码单独设计了……好厉害……
zander
2016-08-06 21:10:04 +08:00
@7sDream 都是手工作品,不是靠图片 /二维码合成的。
fsp
2016-08-06 21:19:53 +08:00
看到你喷了知乎,然而想说一句知乎是招 Py 实习的,在北京,有兴趣请投递 fsp@zhihu.com ,逃。。。
Exin
2016-08-06 21:23:16 +08:00
7sDream
2016-08-06 21:36:38 +08:00
@fsp

尴尬 ing 。=,= 虽然说小喷了一下知乎,但是如果不关心,根本喷都不会喷丫……

主要问题不是这个……主要是吧,如果你看看我 github 就会发现,我有两三个项目是和知乎有关的,一个是通过解析 PC 端网页做的 API ,第二个是基于前面这个做的给关注者自动发私信,第三个更是把你们 Android 客户端的 OAuth 2 的协议 Crack 了做了个 API …………要是真去投知乎我总感觉有那么一点尴尬 =,= 毕竟以前是干坏事的……但其实也有好处,比如对知乎的 RESTful 接口和业务比较熟悉什么的……

还是谢谢告知了,正在考虑中。知乎私信我也收到了,如果投的话我会私信联系你滴~ Thx
fsp
2016-08-06 21:42:14 +08:00
@7sDream 点开 github 看了一下,满眼 zhihu ,这还不是真爱么,哈哈
revol
2016-08-06 22:51:19 +08:00
高德招 python ,阿里巴巴旗下的哦
ragnaroks
2016-08-06 23:06:55 +08:00
ragnaroks
2016-08-06 23:08:16 +08:00
google 图片来源关键字 二维码 暴力
7sDream
2016-08-06 23:11:02 +08:00
@ragnaroks

这个应该是用 @chinuno 的 [CuteR]( https://github.com/chinuno-usami/CuteR) 项目做的,效果也很棒
7sDream
2016-08-06 23:11:45 +08:00
@revol

有木有链接扔一个?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/297531

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX