一篇文章带你搞懂有关二维码的方方面面
什么是二维码?
二维码是一种用黑白方块组成的正方形图案,通过黑白方块(1/0)存储信息,可以用手机摄像头扫描后按固定规则解码,还原出文字内容
二维码只能转化出文字吗?
是的,二维码本质上就是一串文字的编码,平常在用的,比如微信支付,加好友等等,都只是文本串的特殊格式,这不是二维码的范畴,二维码仅仅起到图片转文字的作用。
举几个例子:
- 解码出https://…自动跳转网址(这也是支付的流程,比如https://qr.alipay.com/xxx)
- 解码出WIFI:…自动连接WIFI
二维码是怎么被扫出来的?
- 捕获图像:一帧一帧地看
- 图像处理:转成灰度,再转成黑白
- 定位:看看有没有三角的"回"字方块
- 矫正:若有,继续处理图像,拉正
- 读取信息:读取二维码的信息,包含一些去除和纠错的工作
- 解码:得到字符串
- 输出:根据得到的字符串进行相应的操作
二维码是怎么生成的?
我们举一个例子,一个包含字符串"HI"的二维码

可以试着扫扫。接下来就分析一下这个二维码是如何生成的
1.选择编码格式
QR标准支持四种格式(数字/字母+数字/字节/汉字),每个模式都有四位二进制标识符
这里我们使用字节模式,比较广泛。
字节模式的标识符是:0100
2.转码
按ASCII转码
H -> 01001000
I -> 01001001
3.组装数据
模式+长度+数据+终止符(0000)
所以是:
- 0100 (字节模式)
- 00000010 (长度两个)
- 01001000 (H)
- 01001001 (I)
- 0000 (终止符)
4.模式选择
二维码有几个版本,叫Version 1,Version 2 等等。
这里发现"HI"很短,所以选用Version 1,但是实际可能更复杂
5. 生成纠错码字
有一些算法,这里就不介绍了,总之这里的目的是让一些东西被遮挡之后也可可能扫出原来的东西
6. 填入矩阵


总的来说,就是一个一个模块的填入
从右下角开始填,两列两列蛇形填入,具体看:

遇到特殊的东西就直接跳过
发现除了三个回字型,还有什么特殊的地方了吗?
时序图案
连接三个定位图案(回),用于图像的校准

结尾
二维码确实牛逼