不知道从什么时候开始,二维码已经成为我们生活必不可少的一部分,支付扫二维码,骑车扫二维码,甚至我们近期出行必备的健康码也是二维码。
绿色这个词又有了更加丰富的含义,我是绿的,你呢…
今天我要来挑战一下用彩虹糖摆出一个可以扫一扫的二维码,但是现在心里还一点底都没有,先来验证一下是否可行吧~
我们都知道二维码就是一组二进制数组的组合,比较常见的就是这种黑白搭配的二维码,每一个小黑方格都代表1,小白方格代表0。
但其实这个方格不仅仅可以黑白搭配,红白搭配、红绿搭配也可以,只需要两个颜色有对比。
甚至这个黑块不仅限于是方形的,还可以是其他形状,比如圆形。
如果这个圆形是五颜六色的,那不就是彩虹糖的样子嘛。
我们来用Python实现一下,已经有现成的轮子了(myqr),我们拿来稍微修改一下,就可以了。
def draw_a_black_unit(p, x, y, ul):
draw = ImageDraw.Draw(p)
font = ImageFont.truetype("/Library/Fonts/Arial Unicode.ttf", 10, encoding="utf-8")
colors = ["red","orange","green","blue","purple"]
color = random.choice(colors)
draw.text((x, y), '●', fill = color, font=font)
再用命令行生成一下,彩虹糖二维码就出现啦~
myqr https://space.bilibili.com/279911711
用手机试了一下可以成功识别(微信识别比较困难,我用的是某宝的扫一扫),说明我们的思路是可行的~
但是现在竟然有691个圆点,也就是需要691颗彩虹糖,一包彩虹糖大约有40颗,除去黄色的不能用,能用的大约是30颗,那我就是要买24包,一包3块钱。。。
贫穷让我即将生锈的大脑快速运转了起来。怎样让这些圆点少一点节省一下开销呢?
那我们先要了解一下事情,二维码是有纠错等级的。
比如我把这一块挡住,还是可以扫描出来二维码的内容,说明挡住的这一块没有也可以。
那纠错等级越低呢,多余的点数就越少,所以第一个思路,降低二维码的纠错等级。
现在少了很多,但是还是有446个圆点,还是超出了我的预算。。。
要进一步减少圆点的数量,要知道二维码最后一步都会用掩码来处理,避免出现大面积的空白或者是黑块,影响扫码识别。
现在有8种款式的掩码,系统会给这些掩码打分,选择其中将二维码打散程度最优秀的掩码。
但我们就自己玩玩,不需要选择最优秀的掩码,咱们选择导出二维码点数最少的掩码就可以了~
继续改代码
def mask(mm, m):
mps = get_mask_patterns(mm)
scores = []
for mp in mps:
score = 0
for i in range(len(mp)):
for j in range(len(mp)):
mp[i][j] = mp[i][j] ^ m[i][j]
if mp[i][j] == 1:
score += 1
scores.append(score)
best = scores.index(min(scores))
就是这个了,现在还是需要414个彩虹糖,好像也没少多少…
没关系,我还有最后一招,就是缩短网址,找一个网站将B站主页的这个网址转换一下就好了
再来生成看一下
明显少了很多,现在只需要310个彩虹糖了,跟原先691个比起来节省了一半多的钱~
那我们现在就来试试实物吧!
我用彩虹糖摆了个二维码...
大功告成~
唯一遗憾的就是转换的短链接失效了,不能跳转到B站网页上面了。
还有用淘宝的扫一扫更容易识别,微信的比较困难,得找角度…