- 二维码历史
上个世界 60 年代至 70 年代,条形码联合发明人诺曼?约瑟夫?伍德兰德(Norman Joseph Woodland)发明了一维码(条形码)。 缺点:容量少,只能包含字母和数字、条形码尺寸相对较大(空间利用率较低)、条形码遭到损坏后便不能阅读的缺点。 二维码就出现了, 1994 年,日本电装公司正式宣布公开首个 QR Code,而 QR 的全称就是“Quick Response”,翻译过来就是快速响应。公开免费使用专利,但是真正大规模使用还是在我国。 二维码靠着移动支付才真正的发展壮大。 三种移动支付方式:
移动支付方式 | 优点 | 推广 |
---|
NFC | 方便,无网络也可支付 | 2.4GHz标准与13.56MHz标准长期处于互相不兼容的竞争状态, 造成NFC模式始终没有形成大范围的推广态势,错过推广机会 | 声波支付 | 想不出 | 成本大 | 二维码 | 高密度编码,信息容量大 编码范围广:可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码; 可以表示多种语言文字;可表示图像数据。 容错能力强,具有纠错功能 可引入加密措施:保密性、防伪性好。 | 微信、银联和支付宝三巨头之间的竞争加剧推广 缺点:维码技术成为手机病毒、钓鱼网站传播的新渠道 |
二维码有
所以用啥懂了吧。
- 二维码分类
二维码 | 原理 | 代表 |
---|
线性堆叠式二维码(行排式二维条码) | 建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容 | Code 16K、Code 49、PDF417、MicroPDF417 等 | 矩阵式二维码 | 它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。 | Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix | 邮政码 | | 邮政专用 |
- 识别设备
依据原理:
- 线性CCD和线性图像式阅读器(Linear Imager)
可阅读一维条码和线性堆叠式二维码,在阅读二维码时需要沿条码的垂直方向扫过整个条码。 - 带光栅的激光阅读器
可阅读一维条码和线性堆叠式二维码。阅读二维码时将光线对准条码,由光栅元件完成垂直扫描,不需要手工扫动 - 图像式阅读器(Image Reader)
采用面阵CCD摄像方式将条码图像摄取后进行分析和解码,可阅读一维条码和所有类型的二维条码。
- 三大标准
- PDF417:不支持中文;
- DM:专利未公开,需要支付专利费用;
- 3.QR Code:专利公开,支持中文。
- 纠错等级
- L级:约可纠错7%的数据码字
- M级:约可纠错15%的数据码字
- Q级:约可纠错25%的数据码字
- H级:约可纠错30%的数据码字
- 原理
黑色块代表二进制1 空白0(现在的有其他颜色)
- 位置探测图像(位置分隔符作用一样)
定位作用,所以倒着也能扫 - 校正图形:Version 2以上(包括Version2)才有
版本不同,个数不同,扫歪或者二维码不平,侧着拍也行的原理 他的位置举例 取版本2来说,第6行第6列取出来,第18行第18列取出来相交的点就是,如果刚好碰到了位置探测图像就取消该点 如
校正图形位置表
版本 | 行列 |
---|
2 | 6,18 | 3 | 6, 22 | 4 | 6, 26 | 5 | 6, 30 | 6 | 6, 34 | 7 | 6, 22,38 | 8 | 6, 24,42 | 9 | 6 ,26, 46 | 10 | 6 ,28, 50 | 11 | 6 ,30, 54 | 12 | 6 ,32, 58 | 13 | 6, 34,62 | 14 | 6, 26,46,66 | 15 | 6, 26,48,70 | 16 | 6, 26,50,74 | 17 | 6, 30,54, 78 | 18 | 6, 30,56,82 | 19 | 6, 30,58, 86 | 20 | 6, 34,62, 90 | 21 | 6, 28,50, 72,94 | 22 | 6, 26,50,74 ,98 | 23 | 6,30,54,78,102 | 24 | 6, 28,54,80,106 | 25 | 6, 32,58,84,110 | 26 | 6, 30,58, 86,114 | 27 | 6, 34,62, 90,118 | 28 | 6, 26,50, 74,98,122 | 29 | 6, 30,54, 78,102,126 | 30 | 6, 26,52, 78,104,130 | 31 | 6, 30,56, 82,108,134 | 32 | 6, 34,60, 86,112,138 | 33 | 6, 30,58, 86,114,142 | 34 | 6, 34,62, 90,118,146 | 35 | 6, 30,54, 78,102,126,150 | 36 | 6, 24,50, 76,102,128,154 | 37 | 6, 28,54, 80,106,132,158 | 38 | 6, 32,58, 84,110,136,162 | 39 | 6, 26,54, 82,110,138,166 | 40 | 6, 30,58, 86,114,142,170 |
- 版本信息
Version 7 及以上,需要预留两块3 x 6的区域存放一些版本信息。 18个bits,其中包括6个bits的版本号以及12个bits的纠错码 - 格式信息:
5个数据bits:其中,2个bits用于表示使用什么样的纠错等级, 3个bits表示使用什么样的Mask 10个bits纠错码。主要通过BCH Code Reed-Solomon纠错算法来计算(涉及算法。。。。。) 00 000 000000000
-Dark Module 暗模块其位置始终位于坐标 ([(4 * V) + 9], 8)
- 第一步添加模式
主要的模式:模式如table2所示
模式 | 说明 |
---|
Number | 数字模式用于十进制数字 0 到 9。 | Alpanumeric | 字母数字模式 | byte | 字节模式适用于 ISO-8859-1 字符集中的字符。但是,某些 QR 码扫描器可以自动检测是否在字节模式下使用 UTF-8。 | Kanji | 日本汉字模式用于 Shift JIS 字符集中的双字节字符。经过一系列可以转换中文 | 混合模式 | 暂时不研究 |
- 第二步:确定字符个数如01234567 8个 0000001000注意是 10位以table3为准
- 第三步:数据编码 模式不同就不同
模式 | 举例 | 说明 |
---|
number | 01234567 | 3个为一组 (012),(345),( 67) 3个数字转成10位二进制,如果最后是二个数字则 7 个二进制位,如果最后一位是1个数字则是4位 如012 转成 0000001100 345(0101011001) 67 转成 1000011 | 字母数字模式 | LOVE YOU | 只能对大写字母进行编码,两两为一组(L,O) (V,E) (空格, Y) (O,U), 查下表SP是空格 (L ,O)->(21,24) 然后第一个数字x45 +第二个数字 21*45+24 = 969 转换为11为二进制不够左边补0, 969: ( 0 1111 0010 01) 奇数个字符,取最后一个字符的数字表示并将其转换为 6 位二进制字符串 | 字节模式 | Hello, world! | 将您输入字符串转换为 ISO 8859-1 或 UTF-8(查iso 88859-1的表或者是utf-8转成8为二进制 ?→0x48→01001000 ?→0x65→01100101 | Kanji | 荷 | 日文编码,也是双字节编码,同样,也可以用于中文编码。可以从 Shift JIS Kanji Code Table 查出改字16进制, 如果在0x8140 到 0x9FFC 的范围内减去 0x8140 如荷0x89D7 - 0x8140 = 0x0897 结果是 0x0897。 将该数字拆分为其最高有效字节和最低有效字节:0x0897 的最高有效字节为 0x08 0x0897 的最低有效字节为 0x97 接下来,将最高有效字节乘以 0xC0,然后将最低有效字节添加到结果中: (0x08 * 0xC0) + 0x97 = (0x600) + 0x97 = 0x697最后,将该结果转换为 13 位二进制:0x697 = 0 0110 1001 0111 0xE040 到 0xEBBF 的范围内 减去 0xC140其他与上述一样 | 混合模式 | 暂不讨论 | |
- 第四步把模式 字符个数 数据编码 全放一起用HELLO WORLD举例
编码 | 字符个数 | HELLO WORLD | 结束符 |
---|
0010 | 000001011 | 01100001011 01111000110 10001011100 10110111000 10011010100 001101 | 0000 |
结束符是加起来不够8的倍数补0 最多4个0 HELLO WORLD 字符串中添加终止符后,长度变为 78 位长。这不是 8 的倍数。添加两个 0 使其成为 8 位二进制字节 5. 第5步: 如果字符串仍然不够长,无法填满最大容量,则在字符串末尾添加以下字节,重复直到字符串达到最大长度: 11101100 00010001 最大容量:查看纠错表的最大容量 如 1-Q版本最大容量 13字节 13*8 =104 而上面才80位 加104-80=24, 24/8 =3 个字节补齐码 加完之后就是数据码了
字母数字模式表
-
纠正码: 查看这个表 会把数据码每8个位(bit)1码块分成1-2组 Number of Blocks in Group 1 组1: Number of Data Codewords in Each of Group 1’s Blocks : 组1放的数据块的个数 Number of Blocks in Group 2:组2 Number of Data Codewords in Each of Group 1’s Blocks 组2数据块个数 EC Codewords Per Block 一个数据块要的多少个纠错码字。 纠错码通过Reed-Solomon error correction(里德-所罗门纠错算法)生成详细可以参考这个东西有点复杂。气抖冷 得到纠错码后 第6步,数据码从两组数据块中交错取出数据块排列,纠错码也一样,然后数据码放在纠错码前面 -
数据码与纠正码合起来就是数据区了 -
最后得到的非功能图形与mask(掩模)进行xor运算也就是异或运算(相同的为0,不同为1) 选择不同mask图像 运算后跟据罚点计分选择最低分者 计分规则 -
最小版本
黄色数据区
- 最大容量
7089数字984中文utf-8 代码实现
from MyQR import myqr
myqr.run(words="https://www.bilibili.com/",
version=5,
save_name="33.gif",
colorized=True,
picture="u.gif",
save_dir="pic/")
特别参考https://www.thonky.com/qr-code-tutorial/
|