QRCode 二维码:生于日本,辉煌于中国,原理及(python)实现

2021/7/31 22:36:24

本文主要是介绍QRCode 二维码:生于日本,辉煌于中国,原理及(python)实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1. 二维码历史

上个世界 60 年代至 70 年代,条形码联合发明人诺曼・约瑟夫・伍德兰德(Norman Joseph Woodland)发明了一维码(条形码)。
缺点:容量少,只能包含字母和数字、条形码尺寸相对较大(空间利用率较低)、条形码遭到损坏后便不能阅读的缺点。
二维码就出现了,
1994 年,日本电装公司正式宣布公开首个 QR Code,而 QR 的全称就是“Quick Response”,翻译过来就是快速响应。公开免费使用专利,但是真正大规模使用还是在我国。
二维码靠着移动支付才真正的发展壮大。
三种移动支付方式:

移动支付方式优点推广
NFC方便,无网络也可支付2.4GHz标准与13.56MHz标准长期处于互相不兼容的竞争状态,
造成NFC模式始终没有形成大范围的推广态势,错过推广机会
声波支付想不出成本大
二维码高密度编码,信息容量大
编码范围广:可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码;
可以表示多种语言文字;可表示图像数据。
容错能力强,具有纠错功能
可引入加密措施:保密性、防伪性好。
微信、银联和支付宝三巨头之间的竞争加剧推广
缺点:维码技术成为手机病毒、钓鱼网站传播的新渠道

二维码有在这里插入图片描述

图源网络

所以用啥懂了吧。

  1. 二维码分类
二维码原理代表
线性堆叠式二维码(行排式二维条码)建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容Code 16K、Code 49、PDF417、MicroPDF417 等
矩阵式二维码它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix
邮政码邮政专用

在这里插入图片描述

  1. 识别设备
    依据原理:
  • 线性CCD和线性图像式阅读器(Linear Imager)
    可阅读一维条码和线性堆叠式二维码,在阅读二维码时需要沿条码的垂直方向扫过整个条码。
  • 带光栅的激光阅读器
    可阅读一维条码和线性堆叠式二维码。阅读二维码时将光线对准条码,由光栅元件完成垂直扫描,不需要手工扫动
  • 图像式阅读器(Image Reader)
    采用面阵CCD摄像方式将条码图像摄取后进行分析和解码,可阅读一维条码和所有类型的二维条码。
  1. 三大标准
  • PDF417:不支持中文;
  • DM:专利未公开,需要支付专利费用;
  • 3.QR Code:专利公开,支持中文。
  1. 纠错等级
  • L级:约可纠错7%的数据码字
  • M级:约可纠错15%的数据码字
  • Q级:约可纠错25%的数据码字
  • H级:约可纠错30%的数据码字
  1. 原理
    黑色块代表二进制1 空白0(现在的有其他颜色)
    在这里插入图片描述
  • 位置探测图像(位置分隔符作用一样)
    定位作用,所以倒着也能扫在这里插入图片描述
  • 校正图形:Version 2以上(包括Version2)才有
    版本不同,个数不同,扫歪或者二维码不平,侧着拍也行的原理
    在这里插入图片描述
    他的位置举例
    取版本2来说,第6行第6列取出来,第18行第18列取出来相交的点就是,如果刚好碰到了位置探测图像就取消该点

在这里插入图片描述
在这里插入图片描述
校正图形位置表

版本行列
26,18
36, 22
46, 26
56, 30
66, 34
76, 22,38
86, 24,42
96 ,26, 46
106 ,28, 50
116 ,30, 54
126 ,32, 58
136, 34,62
146, 26,46,66
156, 26,48,70
166, 26,50,74
176, 30,54, 78
186, 30,56,82
196, 30,58, 86
206, 34,62, 90
216, 28,50, 72,94
226, 26,50,74 ,98
236,30,54,78,102
246, 28,54,80,106
256, 32,58,84,110
266, 30,58, 86,114
276, 34,62, 90,118
286, 26,50, 74,98,122
296, 30,54, 78,102,126
306, 26,52, 78,104,130
316, 30,56, 82,108,134
326, 34,60, 86,112,138
336, 30,58, 86,114,142
346, 34,62, 90,118,146
356, 30,54, 78,102,126,150
366, 24,50, 76,102,128,154
376, 28,54, 80,106,132,158
386, 32,58, 84,110,136,162
396, 26,54, 82,110,138,166
406, 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)
在这里插入图片描述

  • 数据码(什么模式+字符长度+数据+结束符)

在这里插入图片描述

  1. 第一步添加模式
    主要的模式:模式如table2所示
模式说明
Number数字模式用于十进制数字 0 到 9。
Alpanumeric字母数字模式
byte字节模式适用于 ISO-8859-1 字符集中的字符。但是,某些 QR 码扫描器可以自动检测是否在字节模式下使用 UTF-8。
Kanji日本汉字模式用于 Shift JIS 字符集中的双字节字符。经过一系列可以转换中文
混合模式暂时不研究
  1. 第二步:确定字符个数如01234567 8个 0000001000注意是 10位以table3为准
  2. 第三步:数据编码 模式不同就不同
模式举例说明
number012345673个为一组 (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其他与上述一样
混合模式暂不讨论
  1. 第四步把模式 字符个数 数据编码 全放一起用HELLO WORLD举例
编码字符个数HELLO WORLD结束符
001000000101101100001011 01111000110 10001011100 10110111000 10011010100 0011010000

结束符是加起来不够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)实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程