呼,这个很久之前定的目标今天终于差不多算写出来了。
几个月之前发现了一篇文章,是 Russ Cox 写的一篇关于将二维码与图片结合的,我觉得很好玩就准备动手实现。
其实已经有了其他实现的,我记得代码家的微博好像还推荐过,就是这个:https://github.com/dieforfree/qart4j
所以可能很多人都知道这个东西了,我读完 qart4j 的代码( QwQ ,好难读,没注释,而且我还不会 Java )之后开始用 Python 实现我自己的版本,其他的就不多说了,看几个例子:
扫描这个二维码就能打开 V2EX 的首页啦~~
这个是我的 Github
这个是 bilibili
啊对了,需要说明的是,二维码的编码部分也是我自己写的,没有调用库,独立出来了一个 pyqr 的 cli 用于生成普通的二维码,使用效果大概是这样:
当然,也是可以生成图片的,加个 -o 参数就好
pyqart 的 cli 也支持打印在 terminal 里的,例子:
其他的细节看 Readme 吧,pyqr -h
和 pyqart -h
可以查看更多帮助。
因为有点复杂我就不在帖子里说了,涉及到二维码的编码规范和里德所罗门纠错码之类的东西,大家可以暂时看上面那篇算法提出者写的文章,有可能以后我会写一系列文章仔细说明这个实现。
代码在这: https://github.com/7sDream/pyqart
扫描下面这个二维码也可以访问:
我的其他项目可以在 Github 上看……除了那两个最先的 piano 项目,其他的都挺好玩儿的……
额,开学就大四了,然而工作和实习都并没有着落…………
听说阿里今年几乎就不怎么找人,加上它们也没啥 Py 岗……估计是没戏了。 腾讯扔了个简历至今没回应。 网易那个笔试简直了……算法题死活交不上,最后放弃了
未来迷茫中…………
目前座标天津,大四一年准备尽量出去实习吧,有没有什么北京的公司招 Py 实习的,可以联系一下。还有就是毕业以后的工作,有没有公司要的?
以上,谢谢阅读。
本来上午想在我知乎专栏里发篇文章介绍下项目和原理的……然后发现知乎专栏会把上传的包含二维码的图片自动转换成内容……
有点烦这个功能,当时气的不行发了篇文章喷,在这:去你特么的友善度
朋友们可以点进去瞅瞅 =,=
如果大家想实现的话,这里有一些可以参考的资料。
最后这是我项目的架构,如果想阅读源码的同学可以参考:
pyqart.qr 这一部分是一个基本上完整的二维码生成器, data 模块是数据编码, ec 模块是生成纠错码, args 是二维码的参数, painter.canvas 生成二维码的框架, painter.painter 的作用是把 canvas 、 data 、 ec 三部分组合起来,最后交给 printer 里的各种生成器输出二维码。
pyqart.art 里的 QArtSourceImage 是处理输入图像的,做一些二值化,dithering,计算对比度之类的操作。 QrArtist 里的 bis 函数是 QArt 的关键算法。
我代码也没注释的,可能也有点难读,推荐和 qart4j 结合起来读。
1
xcodebuild 2016-08-06 11:43:15 +08:00 via Android 1
看着论文就实现出来了简直 6 的不行
|
2
Sakuramiku 2016-08-06 11:45:18 +08:00
不愧是我 77..
|
3
7sDream OP @codefalling 还是参考了原作者的实现和 java 的实现的……
|
4
designer 2016-08-06 11:54:25 +08:00
虽然这个早就有了但是还是要支持一下!
|
5
zhujinliang 2016-08-06 11:54:51 +08:00
赞!比二维码中间抠个洞的做法高到不知哪里去了
|
7
7sDream OP |
8
kylinking 2016-08-06 12:07:26 +08:00 via iPhone
可以,支持一下~
|
9
sobigfish 2016-08-06 12:22:57 +08:00
url 里 #后面的是故意的还是编码的问题 anyway 很牛
|
10
7sDream OP |
12
ahonn 2016-08-06 12:48:34 +08:00
77 真棒
|
13
7sDream OP |
15
meunicorn 2016-08-06 13:44:10 +08:00
好强。。。
|
16
iLionel 2016-08-06 13:47:26 +08:00
应该是叫做 Halftone QR Codes
|
18
7sDream OP |
19
UnisandK 2016-08-06 13:51:11 +08:00
https://github.com/chinuno-usami/CuteR
这个更好看,可以读读代码 |
20
7sDream OP @UnisandK
我看了一下图,原理不一样。 注意它的图片里,左上,右上和左下这几个定位图形,外边框的黑色块是标准的 一个点 应该占的宽度。 再看图片里面的哪些小的黑点,明显大小是不一样的。 我猜想它的原理应该是这样,先正常生成一张二维码,然后根据图片的二值化数据,来吧原来的二维码进行修改。比如一个黑点所占的地方,在图片里应该是白色,它就把这个点分为 9 份,中间的留黑,周围变白。而扫描仪扫描的时候先按点应该的大小扫到这个点,然后优先判断中心部分的颜色。所以变化后的二维码还能扫描出来。 这个思路也很不错来着~~我下午去看看代码,看跟我想的一样不…… 话说给我二维码上色这个我也准备写来着~ |
21
cfans1993 2016-08-06 14:11:15 +08:00
忍不住打开微信扫了一下 ,棒棒的
|
23
passion336699 2016-08-06 14:19:52 +08:00 via Android
厉害👍
|
25
MyFaith 2016-08-06 14:54:55 +08:00
不错,已 star
|
26
jyhmijack 2016-08-06 15:00:48 +08:00
有木有兴趣来陌陌,在北京 --
|
30
7sDream OP |
32
skydiver 2016-08-06 15:58:49 +08:00 via iPad
转换二维码成 URL 不是为了解决手机没法识别二维码的问题(那样的话只在手机版转换就行了,没必要 web 也转换),而是因为很多答案后面都附加了额外的二维码看起来很影响观感,好多二维码很大占了半屏幕之类的,变成 URL 就整洁多了。
知乎更好的做法是鼠标点一下还是可以显示原图之类。 |
33
7sDream OP |
35
manhere 2016-08-06 16:07:06 +08:00
不错,就是后面的参数太长了
|
38
cuminflea 2016-08-06 17:35:01 +08:00 via iPad
|
39
7sDream OP |
40
Maic 2016-08-06 17:40:39 +08:00
仰望大神
|
41
chinuno 2016-08-06 17:49:27 +08:00 via Android
。你说的没错。我就相当于把点缩小了放图上而已。感觉你这样做出来的要比我干净一些,不过包含了太多垃圾信息扫出来看到后面那坨也难受
|
42
no13bus 2016-08-06 17:52:51 +08:00
天津啥学校的? 很厉害. 支持 python
|
43
7sDream OP @chinuno
是的,是两种不同的思路来着~~ 恩,确实 QArt 这种方式后面必须要加入很多无用的信息,还好网址后面跟锚点不影响访问。 所以 QArt 这种方法仅限于处理包含 URL 的二维码,限制比较大, 你的那种方法适用性比较广。 |
46
nyanyh 2016-08-06 18:11:42 +08:00
失望,连是谁都看不出来了
#手动滑稽 |
48
em2046 2016-08-06 18:29:36 +08:00
膜拜大神
|
53
aljun 2016-08-06 19:11:17 +08:00 via iPhone
用力抱紧 7s 大腿(・∀・)
|
54
coreki 2016-08-06 19:14:57 +08:00 via iPhone
自己实现了,厉害。这种缩小点位后的二维码有更多空间填充图形,比普通二维码有个性多了,
|
56
ynyounuo 2016-08-06 19:41:35 +08:00
这怎么难得倒真正的粉丝?李嘉诚也太好认了啊!
|
57
scola 2016-08-06 19:46:01 +08:00 via Android
厉害~我也看了那个论文~但是没弄懂~可能是我对 QR 码的基础不太了解~期待你的后续怎样
|
58
scola 2016-08-06 19:48:13 +08:00 via Android
后续怎样→后续文章
能说一下要看懂那篇论文需要什么基础知识么? |
59
huybery 2016-08-06 20:02:16 +08:00
我来晚了呀
|
60
cholerae 2016-08-06 20:05:28 +08:00
77 好棒
|
61
7sDream OP @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 结合起来读) |
62
7sDream OP |
63
imeoer 2016-08-06 20:30:02 +08:00
太赞啦,大概试了几次 url 没有扫出来,我再试试
|
66
7sDream OP |
68
zander 2016-08-06 21:03:07 +08:00 2
分享一些更艺术的。
都是 TGFC 一个网友做的,接受定制服务。 |
69
7sDream OP |
72
fsp 2016-08-06 21:19:53 +08:00
看到你喷了知乎,然而想说一句知乎是招 Py 实习的,在北京,有兴趣请投递 [email protected] ,逃。。。
|
73
Exin 2016-08-06 21:23:16 +08:00
牛
|
74
7sDream OP @fsp
尴尬 ing 。=,= 虽然说小喷了一下知乎,但是如果不关心,根本喷都不会喷丫…… 主要问题不是这个……主要是吧,如果你看看我 github 就会发现,我有两三个项目是和知乎有关的,一个是通过解析 PC 端网页做的 API ,第二个是基于前面这个做的给关注者自动发私信,第三个更是把你们 Android 客户端的 OAuth 2 的协议 Crack 了做了个 API …………要是真去投知乎我总感觉有那么一点尴尬 =,= 毕竟以前是干坏事的……但其实也有好处,比如对知乎的 RESTful 接口和业务比较熟悉什么的…… 还是谢谢告知了,正在考虑中。知乎私信我也收到了,如果投的话我会私信联系你滴~ Thx |
76
revol 2016-08-06 22:51:19 +08:00
高德招 python ,阿里巴巴旗下的哦
|
77
ragnaroks 2016-08-06 23:06:55 +08:00
|
78
ragnaroks 2016-08-06 23:08:16 +08:00
google 图片来源关键字 二维码 暴力
|
79
7sDream OP |
82
qq915458022 2016-08-06 23:31:29 +08:00 via Android
支持一个
|
83
RobertYang 2016-08-06 23:38:32 +08:00 via Android
马克下,明天看
|
87
Geeker 2016-08-07 00:59:46 +08:00
看着论文就实现出来了简直 6 的不行 +1
|
89
scola 2016-08-07 08:01:55 +08:00 via Android
谢谢回复~我去学习一下
|
90
ariza 2016-08-07 10:54:00 +08:00
滋辞
|
91
zzczzc 2016-08-07 14:23:34 +08:00
挺棒的
|
92
zjyjer 2016-08-08 00:19:43 +08:00
腾讯投简历是找人内推了?
|
94
Sunyanzi 2016-08-08 00:53:42 +08:00
二维码可玩的东西太多了 ... 另一种玩法可以参考我头像 ...
|
95
zjyjer 2016-08-08 11:48:08 +08:00 1
|
97
Allianzcortex 2016-08-08 15:45:42 +08:00
厉害厉害
|
98
Allianzcortex 2016-08-08 16:16:42 +08:00
同为 Python 党,话说回来当时还给 zhihu-python 提了个 PR,当时学习的时候 py2 还是主流,突然间大家就都转向 py3 了。 Django 文档翻译?其实看 Django 1.9 的文档那段期间是英语水平提升最快的一个阶段 haha ~~看 CSAPP 里面的英文还是学术了点。
不知道有没有兴趣来我们公司呢?虽然达不到 BAT 级别,但我们有 T-star 计划啊:-D (找了一个比较随便的 [链接]( http://sse.ustc.edu.cn/pages/xxll.php?newsid=1200))确实厉害,比我大三的时候棒多了。 Python 在数据挖掘和运维上都有很大应用,简历请发 @mailto:[email protected] |
99
Allianzcortex 2016-08-09 14:32:06 +08:00
木有兴趣么?。。。
|
100
7sDream OP |