QRCode 二维码:生于日本,辉煌于中国,原理及(python)实现
2021/7/31 22:36:24
本文主要是介绍QRCode 二维码:生于日本,辉煌于中国,原理及(python)实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 二维码历史
上个世界 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,#版本1-40 save_name="33.gif",#保存二维码的名字 colorized=True,#有颜色的二维码,false就是黑白二维码 picture="u.gif",#你用做生成二维码的背景图片 可以是gif 也可以是png jpep等格式 save_dir="pic/")#保存的地方
特别参考https://www.thonky.com/qr-code-tutorial/
这篇关于QRCode 二维码:生于日本,辉煌于中国,原理及(python)实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20Python编程入门指南
- 2024-12-20Python编程基础与进阶
- 2024-12-19Python基础编程教程
- 2024-12-19python 文件的后缀名是什么 怎么运行一个python文件?-icode9专业技术文章分享
- 2024-12-19使用python 把docx转为pdf文件有哪些方法?-icode9专业技术文章分享
- 2024-12-19python怎么更换换pip的源镜像?-icode9专业技术文章分享
- 2024-12-19Python资料:新手入门的全面指南
- 2024-12-19Python股票自动化交易实战入门教程
- 2024-12-19Python股票自动化交易入门教程
- 2024-12-18Python量化入门教程:轻松掌握量化交易基础知识