这儿所说的二维码默认指的就是我们常常用到的微信二维码这样方形格式的,二维码的英文全称是 Quick Response Code,快速响应矩阵图码。

我们简直不要太了解了,均匀每天都要扫码好几次,做核酸扫码、吃饭付钱扫码、进出办公楼扫码。

二维码就是用是非或许明暗的格子来别离代表1和0,用黑色代表1,白色代表0,将0和1连接成二进制串,就能幻化出各种各样的内容,当然其间要通过各种算法、编码、解码等操作。

这是群众号的二维码,里边存储的内容其实就是一个链接地址,也就是一段文本内容,然后用微信扫码或许直接长按辨认后,通过微信二维码辨认程序的处理,将其间的内容读取出来,并且通过一系列的检测,判别这是微信群众号的二维码,所以跳转到群众号主页。

那二维码存储的不都是文本吗,不管是链接仍是什么其他的东西,都是将二维码解析之后再做处理,是链接就跳转、是纯文本就显示。是这样没错,但是究竟二维码终究是以图片的办法展现,仍是要越小越好。

所以,二维码在初步规划的时分就拟定了几种办法,每种办法都用最简便的编码办法处理,保证终究出来的二维码最简略。

二维码的几种办法

二维码说白了其实就是一种协议,和我们熟知的 IP、HTTP 协议相似,都是规则好一个规范,比如 IP 的头部信息,用4bit标明版别号,4bit标明首部长度等。

用4个bit符号其时二维码所选用的的办法,反应到二维码上就是4个格子。

数字编码办法

此办法对应的场景是内容全部都是数字的情况,符号为0001。

二维码的隐秘

字符编码办法

内容包含数字和大写的A-Z(不包含小写)、以及$ % * + – . / : 和空格,符号为 0010 。

字节编码办法

支撑0x00~0xFF内所有的字符,符号为 0100。

Kanji mode

日文办法,因为二维码是日本的工程师发明的,双字节编码,这个办法下也可以支撑中文,符号为 1000 。

中文

支撑中文,一个中文占3个字节,符号为 1101 。

混合办法

一同支撑多种编码格式,可以包含中文、应为、数字等内容,符号为 0011 。

ECI

用于特别字符,符号为 0111 。

FNC1

主要是给一些特其他工业或职业用的,比如GS1条形码之类的。

二维码版其他概念

二维码版别是从0到40,每增加一个版别,在现有基础上横向增加4行、纵向增加4列,核算公式为(V - 1) * 4 + 21,其间V是版别号,比如版别是1,就是横竖各21个格子,版别号是2,就是横竖各25个格子。

例如下图,其间内圈白色的版别号为1,格子数为 21 x 21,外圈加上了黄色的框,版别号为2,运用公式核算,其格子数为 25 x 25,横竖各增加了 4 个。

二维码的隐秘

版别越大,格子数越多,包含的信息量就越大,但一同生成和辨认所需的时间也就越长,并且假设二维码的面积不变,那生成的格子也就越密集。

相同都是一个英文字符 A的二维码,左边版别号为1,右边版别号为40,明晰程度一望而知。

二维码的隐秘

容错率

我们都知道,二维码在遮住其间的某些部分,或许不太清楚的情况下, 大多数时分依然能辨认出来的,这其实是和二维码本身规划机制中的容错率有关的。

下面两个二维码,左边遮挡了一小部分,右边遮挡了比较大的部分,左边就可以正常的辨认出来,而右边的不管用什么客户端也辨认不出来。

二维码的隐秘

我们平常日子中也能碰到这种情况,比如之前骑同享单车的时分,有的二维码被刮了一点,但是仍是可以扫出来的,但是有的二维码被刮花了很大纷歧部分,不管扫多长时间也杯水车薪。

容错率有4个等级,容错等级越高可批改的面积就越大,最高的批改率抵达30%,也就是二维码有将近 1/3的面积被覆盖了,依然能辨认出来,当然不包含一些要害的区域,接下来会提到。

L 级

约 7 %的字码可被批改

M 级

约 15%的字码可以被批改

Q 级

约 25%的字码可以被批改

H 级

约 30%的字码可以被批改

一般场景下,容错率都在15%左右,因为容错等级越高,价值就越大,为了批改被隐秘的部分,只能参加更多的冗余信息。

字码是二维码中定义的一个概念,其实就是 8个bit,一个字节的单位。

最大容量

决议二维码的最大容量的要素有两个,一个是版别,一个是容错率。

版别越大,其格子数越多,所以可以编码的二进制位就越多,终究所能存储的数据量也就越多。

容错率越低,其间所冗余的用于纠错的信息就越少,所以终究实在的数据内容也就越大,因为总容量是固定的。

下面表格是版别号40(最大版别号)、容错率为L(最低容错)的情况下,不同的内容类型所能承载的最大容量,数字最多是7089个,而选用 UTF-8 编码的中文最多就984个。

内容类型 (关于版别40)
数字 最多7,089字符
字母 最多4,296字符
二进制数(8 bit) 最多2,953 字节
日文汉字 最多1,817字符(选用Shift JIS)
中文汉字 最多984字符(选用UTF-8)

现实情况中,一般也不会用二维码做大量的存储,我们可以看一下包含大量内容的二维码终究的生成效果。现已给出提示了,手机和扫码枪不易扫码。

二维码的隐秘

生成进程

用最简略的版别为1的二维码举例。

三个回型定位区域

这三个回型的区域可以协助扫码器(例如微信或扫码枪)定位二维码的,与三个回型定位区域紧挨的格子要留白,也就是下图蓝色线地址的格子。

并且终究在二维码的周围要有一定的留白空间,这样可以协助扫码器快速的定位二维码的整个区域。

二维码的隐秘

在版别大于1的时分,还有一个小的定位块,在靠右下的蓝色框方位。

二维码的隐秘

定位线

两条用来定位的定位线,一般用在版别比较高的二维码上。

二维码的隐秘

填充格式数据

有一些固定的格子是用来存储其时二维码的格式信息的,比如版别号、容错等级、编码办法。下图中的蓝色格子,别离有两组15bit的区域,这两部分就用来存储其时二维码的格式信息,以二进制串的办法呈现,不同的容错等级以及其他设置不同,然后核算出来的二进制串也不同。这部分核算有专门的算法,也可以通过查表的办法获取,因为总共的组合办法是固定的,也就是几十种。

这部分的数据因为有容错率的规划,所以其实也是有冗余的,不但只要内容数据容错,格式数据假设有部分遮挡的情况,也应该能辨认出来。

二维码的隐秘

假设版别大于6的话,会另外在右上和左下的回型区域的周围开荒两块3 x 6 的区域,用来存储更多的格式信息。如下图的赤色格子。

二维码的隐秘

填充内容数据

填充完格式数据后,剩下的就是实在的内容数据了,不同的办法有不同的核算办法。

例如字符办法。 1、拆成字符对:HE, LL, O (空格), WO, RL, D 2、参看字母数字表,转换成对应的数字,然后用榜首个字符数字*45+第二个字符数字,再转换成二进制,一个字符补满6位,两个字符补满11位。例如:HE=(45*17)+14=779,再转换成二进制 779 → 01100001011。为什么要乘以45呢,就是这么约好的。

确认了办法和容错等级,就能确认二维码所能包容的最大值,假设数据量较少,没有抵达最大值,就要在内容二进制串后边加上四个0bit位 0000,用来标明实在内容的结束。

假设依然不够最大长度,则在后边接连参加 236和17的二进制串 11101100 00010001,至于为什么是这两个数字,没有为什么,就这么约好的。

终究将核算出来的二进制串从右下角初步依次填充,每次跨两列。跳过回型定位区、定位线,以及个数数据区域。遇到1就填充成黑色或许深色,遇到0就填充上白色或许淡色。

二维码的隐秘

掩码美化

其实上一步生成好的二维码就现已可以用了,但是数据都非常会合,所以终究的出来的二维码黑色块和白色块分配严重不均,终究的效果就不太好。比如下面这样的

二维码的隐秘

为了颜值,所以基本上在生成终究二维码之前都会加上掩模这一步。其实就是和8种固定的图像(被称作掩码图像)中的一种做异或核算,终究就可以得到一个分布均匀且比较美观的终究形状。下面是这8种掩码图像。

二维码的隐秘

终究的效果就是我们常常看到的那些二维码。

还可以到一些在线的渠道对生成的二维码进行美化,终究的呈现的效果或许像下面这样,不过美化的过火,辨认起来就比较慢了,不信你可以辨认下面的二维码感受一下。

二维码的隐秘

参看文档:www.nayuki.io/page/creati…