— YEAR —
2018
0624
I AM HERE
New In Here❤
June 24th,2018
很久没更新了,很高兴为数不多的粉丝没有抛弃佳爷呀
有段时间很想写点什么,涂涂改改最后放弃
一直以来,我自己写的博客质量都比较堪忧,可能里面有些错误的地方,不想误人子弟
所以打算以一个严谨的态度,对待后花园,无论是blog还是生活物语
更新的速度估计依旧慢得像乌龟
这次想写写二维码,主要是前几天和Space大大在回去的路上,他扫了辆小黄车,然后和我说;“你别看这个扫一扫很简单,这里面的原理还是很复杂的,你知道么?”
然后被科普了二维码的实现原理以及扫描原理,涨姿势了,遂落笔记下。
QR基本结构
先来个二维码,看看都发现了什么?
注意观察,有什么新发现么?对,没错,矩形二维码的三个角落有三个相同的小正方形耶。为什么是三个呢?(因为三个点就可以确定一个平面了,无论怎样旋转都不会影响扫描)
这三个小正方形叫做定位图案。这里有个图,是对上面二维码的解析,可以看看。
(图片来源:ISO/IEC 18004:
Information – Automatic identification and data capture techniques – QR Code barcode symbology specification)
(图片来源:Wikipedia:QR码,https://zh.wikipedia.org/wiki/QR%E7%A2%BC)
通过上面两个图,大致了解了二维码的结构,二维码为什么是黑白相间呢?因为它的实现就是在正方形二维矩阵内通过黑白标识二进制编码(0,1)来编码数据。
位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;
校正图形:规格确定,校正图形的数量和位置也就确定了;
格式信息:表示改二维码的纠错级别,分为L、M、Q、H;
版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。(这里有个概念叫码元:码元是指构成QR码的方形黑白点,码元结构”是指二维码中的码元数。从版本1(21码元×21码元)开始,在纵向和横向各自以4码元为单位递增,一直到版本40(177码元×177码元)。)
数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。
QR编码
通过将数据编码成二进制,这里面可以存放数字,字母,二进制数,中文汉字。
看了上面QR码的基本结构,接下来来了解下QR码的编码过程:
1.数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。
2.数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。
编码: AC-42
1. 从字符索引表中找到 AC-42 这五个字条的索引 (10,12,41,4,2)
2. 两两分组: (10,12) (41,4) (2)
3.把每一组转成11bits的二进制:
5. 把字符的个数转成二进制 (Version 1-H为9 bits ): 5个字符,5转成 000000101
6. 在头上加上编码标识 0010 和第5步的个数编码: 0010 000000101 00111001110 11100111001 000010
关于纠错编码:
按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列。
在二维码规格和纠错等级确定的情况下,其实它所能容纳的码字总数和纠错码字数也就确定了,比如:版本10,纠错等级时H时,总共能容纳346个码字,其中224个纠错码字。
就是说二维码区域中大约1/3的码字时冗余的。对于这224个纠错码字,它能够纠正112个替代错误(如黑白颠倒)或者224个据读错误(无法读到或者无法译码),这样纠错容量为:112/346=32.4%。
经过上面构成最终数据信息:在规格确定的情况下,将上面产生的序列按此列放入分块中。
按规定把数据分块,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块 按顺序构成一个序列,添加到原先的数据码字序列后面。
如:D1, D12, D23, D35, D2, D13, D24, D36, … D11, D22, D33, D45, D34, D46, E1, E23,E45, E67, E2, E24, E46, E68,…
构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。
掩摸:将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布
开始画二维码图
step1 首先三个定位图案“回”
step 2再到校正图形
step3 再到定位图形
step4 接下来是格式信息(蓝色部分)
(Format Information是一个15个bits的信息,每一个bit的位置如下图所示:(注意图中的Dark Module,那是永远出现的))
这15个bits中包括:
5个数据bits:其中,2个bits用于表示使用什么样的Error Correction Level, 3个bits表示使用什么样的Mask
10个纠错bits。主要通过BCH Code来计算
然后15个bits还要与101010000010010做XOR操作。这样就保证不会因为我们选用了00的纠错级别和000的Mask,从而造成全部为白色,这会增加我们的扫描器的图像识别的困难。
step5 然后到版本信息(蓝色部分)
step6 接下来才是数据和数据纠错
然后是填接我们的最终编码,最终编码的填充方式如下:从左下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。
step7 然后是掩码图案,因为上面形成的图形分布不均匀,会有扫描识别上的困难,所以有maskong操作。这里有八个mask供你选择,不会影响内容的。
step8 game over 大致的流程就是这样的。接下来,可以尝试做做。(在知乎上看到有个哥们用python写了个qrcode,可以实战下)
实战-了解一下(有点饿了,回去吃饭,制作留到下一个)
Your's
Zoe
GoodDay
领取专属 10元无门槛券
私享最新 技术干货