小话QRcode

二维码是一个宽泛的定义

所谓二维码,是用某种特定的几何图形按一定规律在二维平面上分布的黑白相间的图形记录数据符号信息。

堆叠式/行排式二维条码

堆叠式/行排式二维条码又称堆积式二维条码或层排式二维条码,其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。。有代表性的行排式二维条码有:Code 16K、Code 49、PDF417、MicroPDF417 等。
PDF417
CODE49
堆叠式二维码由在一个矩形中按垂直方向堆叠的许多条码组成。普通激光扫描仪可读取堆叠式二维码,只要激光可穿透堆叠的所有条码。但是,位移不能超过 ±10°。

矩阵式二维码

它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码,在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”。集成了二维 CCD 的相机或读取器可通过图像处理技术对模块排列进行解码。

可从任何方向上读取

具有代表性的矩阵式二维条码有:Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix 等。

veri code
data matr

QRcode

特点

1.存储大容量信息
传统的条形码只能处理20位左右的信息量,与此相比,QR码可处理条形码的几十倍到几百倍的信息量。

2.在小空间内打印
QR码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右。(还支持Micro QR码,可以在更小空间内处理数据。)

3.有效表现各种字母
QR码是日本国产的二维码,因此非常适合处理日文字母和汉字。QR码字集规格定义是按照日本标准“JIS第一级和第二级的汉字”制定的,因此在日语处理方面,每一个全角字母和汉字都用13比特的数据处理,效率较高,与其他二维码相比,可以多存储20%以上的信息。

组成


QR 码符号共有 40 种规格,分别为版本 1、版本 2……版本 40。版本 1 的规格为 21 模块×21 模块,版本 2 为 25 模块×25 模块,以此类推,每一版本符号比前一版本每边增加 4个模块,直到版本 40,规格为 177 模块×177 模块。

定位相关

  1. 位置探测图形
    识别组成寻象图形的三个位置探测图形,可以明确地确定视场中符号的位置和方向。
  2. 定位图形
    水平和垂直定位图形分别为一个模块宽的一行和一列,由深色浅色模块交替组成,其开始和结尾都是深色模块。它们的作用是确定符号的密度和版本,提供决定模块坐标的基准位置。

  3. 校正图形
    版本 2 以上(含版本 2)的符号均有校正图形,同样是为了定位用的

定位图形和校正图形的位置:

  • 水平定位图形位于上部的两个位置探测图形之间,符号的第 6 行。
  • 垂直定位图形位于左侧的两个位置探测图形之间,符号的第 6 列。
    QR Code Spec标准中给出了各个版本校正图形的数量以及其详细的位置

功能性数据

  1. 格式数据
    Format Information 存在于所有的尺寸中,用于存放一些格式化数据的。如下图的蓝色部分。

    它是一个15个bits的信息,每一个bit的位置如下图所示

    这15个bits中包括:
  • 5个数据bits:其中,2个bits用于表示使用什么样的纠错码级别, 3个bits表示使用什么样的掩码(后文介绍)。
  • 10个纠错bits。主要通过BCH纠错码来计算
  1. 版本数据
    Version Information 在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。一共是18个bits,其中包括6个bits的版本号以及12个bits的纠错码。

    其填充的顺序如下:

    数据码和纠错码

    除了上述的那些地方,剩下的地方存放 Data Code 数据码 和 Error Correction Code 纠错码。
    最终编码的填充方式如下:

    当单个码字长度为8位时,整个二维码的数据区就会被分隔为下图这样的区域

    掩模

    为了 QR 码阅读的可靠性,最好均衡地安排深色与浅色模块,避免出现大面积的空白或黑块,同时应尽可能避免位置探测图形的位图 1011101 出现在符号的其他区域。所以,我们还要做Masking操作

所谓masking操作,就是任意使用下面八种mask图形的一种,对数据区进行异或(XOR)操作

在经过mask操作之后就形成了最终我们看到的QRcode二维码:

QRcode编码过程

QRcode支持的编码方式



1. 数字编码Numeric mode

从0到9。如果需要编码的数字的个数不是3的倍数,那么,最后剩下的1或2位数会被转成4或7bits,则其它的每3位数字会被编成 10bit的长度

例子:编码01234567

  1. 把上述数字分成三组: 012 345 67

  2. 把他们转成二进制: 012 转成 0000001100; 345 转成 0101011001; 67 转成 1000011。

  3. 把这三个二进制补齐10bit串起来: 0000001100 0101011001 1000011

  4. 把数字的个数转成二进制 (version 1-H是10 bits ): 8个数字的二进制是 0000001000

  5. 把数字编码的标志0001和第4步的编码加到前面: 0001 0000001000 0000001100 0101011001 1000011

2. 字符编码Alphanumeric mode
包括 0-9,大写的A到Z(没有小写),以及符号$ % * + – . / : `包括空格。这些字符会映射成一个字符索引表

是把字符两两分组,然后转成下表的45进制,然后转成11bits的二进制,如果最后有一个落单的,那就转成6bits的二进制。而编码模式和字符的个数需要根据不同的Version尺寸编成9, 11或13个二进制

例子:在Version 1的尺寸下,纠错级别为H的情况下,编码: AC-42

  1. 从字符索引表中找到 AC-42 这五个字条的索引 (10,12,41,4,2)

  2. 两两分组: (10,12) (41,4) (2)

  3. 把每一组转成11bits的二进制:

(10,12) 1045+12 等于 462 转成 00111001110
(41,4) 41
45+4 等于 1849 转成 11100111001
(2) 等于 2 转成 000010

  1. 把这些二进制连接起来:00111001110 11100111001 000010

  2. 把字符的个数转成二进制 (Version 1-H为9 bits ): 5个字符,5转成 000000101

  3. 在头上加上编码标识 0010 和第5步的个数编码: 0010 000000101 00111001110 11100111001 000010

3. 字节编码Byte mode
可以是0-255的ISO-8859-1字符。有些二维码的扫描器可以自动检测是否是UTF-8的编码。

4. 日文编码Kanji mode
双字节编码。同样,也可以用于中文编码。日文和汉字的编码会减去一个值。如:在0X8140 to 0X9FFC中的字符会减去8140,在0XE040到0XEBBF中的字符要减去0XC140,然后把结果前两个16进制位拿出来乘以0XC0,然后再加上后两个16进制位,最后转成13bit的编码。如下图示例

5. Extended Channel Interpretation (ECI) mode
主要用于特殊的字符集。并不是所有的扫描器都支持这种编码。

6. Structured Append mode
用于混合编码,也就是说,这个二维码中包含了多种编码格式。

7. FNC1 mode
这种编码方式主要是给一些特殊的工业或行业用的。比如GS1条形码之类的。

结束符和补齐符

假如我们有个HELLO WORLD的字符串要编码,根据上面的示例二,我们可以得到下面的编码:

编码模式:0010
字符数:000001011
HELLO WORLD的编码:01100001011 01111000110 10001011100 10110111000 10011010100 001101
结束符:0000

按照8bit重排列为若干组,最后一组不满8位的,用0补齐:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000

补齐码

最后,如果如果还没有达到我们最大的bits数的限制,我们还要加一些补齐码,标准中规定,所谓补齐码就是重复下面的两个bytes:11101100 00010001 这两个二进制转成十进制是236和17

最大数据容量的限制有下表的标准:

假设我们需要编码的是Version 1的Q纠错级,那么,其最大需要104个bits,而我们上面只有80个bits,所以,还需要补24个bits,也就是需要3个Padding Bytes,我们就添加三个,于是得到下面的编码:

00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 11101100 00010001 11101100

上面的编码就是数据码了,叫Data Codewords,每一个8bits就是一个codeword,也就是码字。

纠错码

光有上面生成的数据码还不够,二维码之所以在遮挡一部分之后还能够扫出来,得益于它强大的纠错能力。QRcode的纠错有这样几个级别:
生成纠错码之前,我们要对数据码进行分组和BLOCK,然后对各个Block进行纠错编码。标准中规定了不同版本和不同纠错等级,使用的不同的分组和分BLOCK方案:

举个例子:上述的Version 5 + Q纠错级:需要4个Blocks(2个Blocks为一组,共两组),头一组的两个Blocks中各15个码字 + 各 9个码字的纠错码(注:最后一例中的(c, k, r )的公式为:c = k + 2 * r,因为后脚注解释了:纠错码的容量小于纠错码的一半)

最终编码

对于数据码:把每个块的第一个codewords先拿出来按顺度排列好,然后再取第一块的第二个,如此类推

就以上面表格的数据为例子,最终形成的数据编码如下:
67, 246, 182, 70, 85,246,230 ,247 ……… ……… ,38,6,50,17,7,236

同样的,纠错码也是一样的处理方式:
213,87,148,235,199,204,116,159,…… …… 39,133,141,236

最终的编码就是下面这样:
67, 246, 182, 70, 85, 246, 230, 247, 70, 66, 247, 118, 134, 7, 119, 86, 87, 118, 50, 194, 38, 134, 7, 6, 85, 242, 118, 151, 194, 7, 134, 50, 119, 38, 87, 16, 50, 86, 38, 236, 6, 22, 82, 17, 18, 198, 6, 236, 6, 199, 134, 17, 103, 146, 151, 236, 38, 6, 50, 17, 7, 236, 213, 87, 148, 235, 199, 204, 116, 159, 11, 96, 177, 5, 45, 60, 212, 173, 115, 202, 76, 24, 247, 182, 133, 147, 241, 124, 75, 59, 223, 157, 242, 33, 229, 200, 238, 106, 248, 134, 76, 40, 154, 27, 195, 255, 117, 129, 230, 172, 154, 209, 189, 82, 111, 17, 10, 2, 86, 163, 108, 131, 161, 163, 240, 32, 111, 120, 192, 178, 39, 133, 141, 236

这就是我们数据区最终的编码。

Remainder Bits

最后再加上Reminder Bits,对于某些Version的QR,上面的还不够长度,还要加上Remainder Bits,比如:上述的5Q版的二维码,还要加上7个bits,Remainder Bits加零就好了。加的数量如下表的“剩余位”

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2021 AURORA_ZXH
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信