我用彩虹糖摆了个二维码...

不知道从什么时候开始,二维码已经成为我们生活必不可少的一部分,支付扫二维码,骑车扫二维码,甚至我们近期出行必备的健康码也是二维码。

绿色这个词又有了更加丰富的含义,我是绿的,你呢…

今天我要来挑战一下用彩虹糖摆出一个可以扫一扫的二维码,但是现在心里还一点底都没有,先来验证一下是否可行吧~

我们都知道二维码就是一组二进制数组的组合,比较常见的就是这种黑白搭配的二维码,每一个小黑方格都代表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站网页上面了。

还有用淘宝的扫一扫更容易识别,微信的比较困难,得找角度…

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵宁一

点赞是最好的赞赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值