Zxing(一)二维码基础知识

移动端开发,一个避不开的老生常谈功能开发,二维码扫描识别(主要)及二维码生成(辅助),虽然已有现成的开源项目提供了功能,仅仅作为功能的开发集成和调试,其实远远不够,应该在完成功能开发的基础上去学习背后的技术点和原理,让我们更加完整的掌握该技术。废话不多说,本篇是 Zxing 相关技术的第一篇文章,本篇不会涉及到应用相关,仅仅是二维码基础知识的学习记录。

QRcode

QRcode(全称:Quick Response Code,快速响应矩阵图码)

  • 1994 年由日本 DENSO WAVE公司发明,
  • QR 码使用四种标准化编码模式(数字,字母数字,字节(二进制)和汉字)来存储数据
  • QR 码可以存储更多信息,可在小空间内打印,可以从 360°任一方向读取,可以对变脏和破损的图码有一定的容错能力,并且可以有效处理各种数据,支持数据合并等
  • QR 码的种类:QR 码(模型1,模型2)Micro QR 码iQR 码SQRCFrame QR

QR 码(模型1,模型2):
模型1:最早制作的 QR 码。最高版本为 14(73x73 码元),最多可以处理 1167 位数字
模型2:是模型1的改良版,最高版本为 40(177x177 码元),最多可以处理 7089 位数字,现在我们通常所说的 QR 码一般指模型2
Micro QR 码:该码只有 1 个定位图案,可以在更小的空间内打印,最高版本为 M4(17x17 码元),最多可以因 35 位数字
iQR码:可生成正方形或长方形,可以支持内外翻转,黑白反色,圆点图案(直接打标在部件上)。理论上的最高版本为 61(422x422 码元),最多大约可以处理 4万位数字
SQRC:安全快速响应代码(Secure Quick Response code,简写SQRC)是一种QR代码,在终结符之后包含“私有数据”段而不是指定的填充字节“ec 11”。必须使用加密密钥对此专用数据段进行解密。这可用于存储私人信息和管理公司的内部信息。
Frame QR:FrameQR是具有“画布区域”的QR码,可以灵活使用。在这个代码的中心是画布区域,其中可以灵活地安排图形,字母等,使得可以布置代码而不会丢失插图,照片等的设计

标准及发展

  • 1997年10月:AIM(自动识别和流动协会)国际
  • 1999年1月:JIS X 0510
  • 2000年6月
    • ISO / IEC 18004:2000信息技术 - 自动识别和数据捕获技术 - 条形码符号 - QR码(现已撤销)
    • 定义QR码模型1和2符号
  • 2006年9月1日:
    • ISO / IEC 18004:2006信息技术 - 自动识别和数据捕获技术 - QR码2005条形码符号规范(现已撤销)
    • 定义QR码2005符号,QR码模型2的扩展。不指定如何读取QR码模型1符号,或要求符合性。
  • 2015年2月1日:
    • ISO / IEC 18004:2015信息 - 自动识别和数据捕获技术 - QR码条形码符号规范
    • 将QR Code 2005符号重命名为QR Code,并对某些程序和次要更正添加说明

结构

qrcode-structure

图片来自维基百科,Version7

如图所示,QR码由 5 部分组成

  1. 版本信息:记录具体的版本信息(仅存在 Version7 以上)
    • version1 是 21x21 的矩阵
    • 最高 version40 是 177x177 的矩阵
    • 计算公式:(V-1)*4+21,V 代表版本号
  2. 格式信息:记录使用的掩码纠错等级
  3. 数据及容错密钥
  4. 数据需求模块
  5. 静态区域

IEC 18004

qr-iec-18004
IEC 18004标准中给出了详细的说明

  • 位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;
  • 校正图形:规格确定,校正图形的数量和位置也就确定了;
  • 格式信息:表示改二维码的纠错级别,分为L、M、Q、H;
  • 版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。
  • 数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)

掩码

掩码的作用

  1. 为了对数据区域进行掩模以利于扫描仪识别,可以避免数据区域出现连续的空白或连续的黑色区,
  2. 避免了数据区出现类似定位点样式的正方形出现。掩模图案在整个数据区域的网格内不断重复进行掩模计算(功能图形不进行掩模),数据区上对应掩模黑色模块的单元将会反转。
  3. 每个二维码上会有两组相同的格式信息出现,并且带有 BCH 纠错

在计算机科学中,掩码就是一个二进制串,通过和数据进行异或运算来变换数据。在 QR 码中,掩码也是通过异或运算来变换数据矩阵,所以 QR 码掩码就是预先定义好的矩阵

纠错等级

相对而言,容错率愈高,QR 码图形面积愈大,所以一般折中使用 15% 容错能力

| 错误修正容量 |
| — | — |
| L 等级 | 7%的字码可被修正 |
| M 等级 | 15%的字码可被修正 |
| Q 等级 | 25%的字码可被修正 |
| H 等级 | 30%的字码可被修正 |

编码 QR 码步骤

  1. 数据分析(data analysis):分析输入数据,根据数据决定要使用的 QR 码版本、容错等级和编码模式
  2. 编码数据(data encoding):根据选择的编码模式,将输入的字符串转变成比特流,插入模式标识码(mode indicator)和终止标识符(terminator),将比特流切分成 8 比特的字节,加入填充字节来满足标准的数据字码数要求
  3. 计算容错码(error correction coding):对步骤二产生的比特流计算容错码,附在比特流之后。高版本的编码方式可能需要将数据流切分成块再分别进行容错码计算
  4. 组织数据(structure final message):根据结构图把步骤三得到的有容错的数据切分,准备填充
  5. 填充(module placement in matrix):把数据和功能性图样根据标准填充到矩阵中
  6. 应用数据掩码(data masking):应用标准中的 8 个数据掩码来变换编码区域的数据,选择最优的掩码应用
  7. 填充格式和版本信息(format and version information):计算格式和版本信息填入矩阵,完成 QR 码

附录

  • 维基百科·QR码·中文
  • 维基百科·QR码·英文·推荐
  • 二维码(QR code)基本结构及生成原理
  • QRcode
  • 二维码的生成细节和原理
  • 为程序员写的Reed-Solomon码解释
  • ISO/IEC 18004:2015·PDF
  • ISO/IEC 18004:2015·PDF