二维码解剖学

背景介绍

二维码(Quick Response Code,常缩写为 QR Code),是一种在二维方向上存储和表达信息的矩阵式条码,由日本电装公司(Denso Wave)于 1994 年发明。相较于传统一维条形码只能在水平方向存储数据,二维码突破限制,在水平和垂直方向均可存储信息,大大提升了数据存储密度与容量。 二维码是Web开发中的常见需求,无论是用户身份验证、支付跳转还是链接分享,我们都依赖它实现高效的数据传递。

本次分享将深入探讨二维码的基本原理、组成部分以及生成和解码的过程,帮助大家更好地理解和应用二维码技术。

二维码的基本原理

二维码的基本原理是将信息编码为一个由黑白模块(小方块)组成的矩阵,这些模块可以被扫描设备(如手机摄像头)识别并解码。凭借独特的设计,二维码能够在不同的角度和光照条件下被快速识别,且具备较强的容错能力,即便出现破损也不影响信息读取。其工作原理具体可拆解为以下步骤:

二维码组成

定位标记(Finder Patterns)

二维码的定位标记通常是三个“回”字形的正方图案,分别位于二维码的左上角、右上角和左下角。这些定位图案的作用是帮助扫描设备快速准确地识别二维码的位置和方向,无论二维码在图像中是正放、倒置、倾斜还是旋转,扫描设备都能通过定位图案迅速找到二维码的边界和角落,从而进行后续的解码操作。

对齐标记(Alignment Patterns)

对齐标记从版本 2 开始引入,当前二维码版本为 1,因此没有对齐标记。

分隔符(Separators)

定位标记周围的白色区域,是专门设计的,用于隔离二维码与背景的干扰,确保了扫描设备能够清晰地识别二维码的边界,避免误读或错误解码。

时序线(Timing Patterns)

时序线是二维码中用于帮助扫描设备确定数据模块位置的辅助图案。版本越高,时序线的数量越多。它们通常位于二维码的顶部和左侧,形成一条连续的线条,帮助设备在解码过程中保持正确的行列对齐。

格式信息(Format Information)

格式信息是二维码中用于存储纠错级别和掩码模式的关键信息。它通常位于二维码的左上角和右下角,包含了二维码的纠错级别(L、M、Q、H)和掩码模式(0-7)。这些信息对于正确解码二维码至关重要,因为它们帮助扫描设备理解如何处理二维码中的数据。

格式信息由15位二进制数据组成,包含纠错级别(高2位)和掩码模式(低3位),剩下的是BCH纠错码(10位)。

当前格式信息: 101101111010010,与固定值0x5412(101010000010010)异或 (硬性设计规范) 后得到000111111000000。 其中00为纠错级别(L-01,M-00, Q-10, H-11),011为掩码模式。

掩码模式(Mask Patterns)

编号:5

(j,i)=>i*j%2+i*j%3===0

编号:4

(j,i)=>(Math.floor(i/2)+Math.floor(j/3))%2===0

编号:7

(j,i)=>(i*j%3+i+j)%2===0

编号:6

(j,i)=>(i*j%3+i*j)%2===0

编号:1

(j,i)=>i%2===0

编号:0

(j,i)=>(i+j)%2===0

编号:3

(j,i)=>(i+j)%3===0

编号:2

(j,i)=>j%3===0

QR码生成时,为了保证二维码具有良好的可读性和识别性,需自动选择最优掩码模式,步骤如下:

  • 对每种掩码模式(0~7)生成临时QR码。

  • 计算惩罚分数(Penalty Score),评估模块分布质量。

  • 选择分数最低的掩码模式。

惩罚规则:

  • 连续模块:逐行逐列检查二维码矩阵,连续5个相同色块+3分,超过5个每增加一个+1分

  • 连续模块:逐行逐列检查二维码矩阵,连续5个相同色块+3分,超过5个每增加一个+1分

  • 大块区域:每出现一个2x2的色块+3分

  • 类似定位标识:如果二维码中出现与定位标识相似的模式(1011101色块),每次发现这样的模式,惩罚分+40分

  • 模块比例:计算二维码中黑色模块所占比例与 50% 的绝对值差,将差值除以 5 并向下取整,再乘以 10 得到惩罚分。

暗模块(Dark Module)

二维码中的暗模块是指二维码中用于存储数据的黑色方块。这些模块通过特定的排列组合来表示不同的信息,是二维码的核心部分。暗模块的设计和布局直接影响二维码的可读性和解码效率。

数据区域(Data Area)

二维码的主体部分,包含了实际存储的信息。数据区域由多个小方块组成,这些方块可以是黑色或白色,代表不同的数据位。二维码的设计允许在有限的空间内存储大量信息,适用于各种应用场景,如商品信息、网址链接等。

二维码解剖

阅读顺序

二维码阅读顺序从右下角开始,以Z字逐行扫描,跳过所有的特殊功能区域。

编码模式

二维码的解码模式指的是二维码在被扫描时所采用的解码方式。不同的解码模式可以影响二维码的解析速度和准确性。常见的解码模式包括自动模式、手动模式等,适用于不同的应用场景。

  • 数字模式(0001):仅包含数字(0-9),每3个数字占用 10 位。储存效率较高,适用于纯数字信息的二维码。

  • 字母数字模式(0010):包含数字(0-9)、大写字母(A-Z)和一些特殊字符(空格、$、%、\*、+、-、.、/),2个字符占用 11 位。储存效率中等,适用于包含字母和数字的二维码。

  • 字节模式(0100):使用 ISO-8859-1 字符集(Latin-1),每个字符占用 8 位。 适用于存储多种语言字符和符号,具有较高的灵活性和兼容性。

这些是最常用的编码模式(还有Kanji模式、ECI - 拓展通道解释等等),二维码生成时会根据输入内容自动选择最合适的编码模式。

当前编码模式为字节模式0100

解码长度

字节编码模式下,原始数据长度由8位二进表示。

当前长度字节为 00001100 ,对应的十进制为 12

解码内容

字节编码模式下,二维码的内容是以字节(8位二进制)形式存储的,每个字节对应一个字符。

纠错算法

纠错码的存在使得二维码在实际应用中更加可靠。二维码的纠错码是通过 Reed-Solomon 算法生成的,它们可以在二维码部分损坏或被遮挡时,仍然能够恢复出原始数据。

二维码的纠错能力分为四个等级:L、M、Q 和 H,分别对应不同的纠错能力。等级越高,二维码能够容忍的损坏程度越大,但同时也会占用更多的空间来存储冗余信息。

  • 低级别(L):可恢复高达 7% 的数据。

  • 中级别(M):可恢复高达 15% 的数据。

  • 四分之一级别(Q):可恢复高达 25% 的数据。

  • 高级别(H):可恢复高达 30% 的数据。

Reed-Solomon算法

可以参考:https://www.nayuki.io/page/reed-solomon-error-correcting-code-decoder

其他

图片嵌入

二维码可以嵌入图片或图标,这种方式通常用于品牌宣传或个性化设计。嵌入图片时需要注意不要遮挡二维码的关键部分,如定位标记和数据区域,以免影响二维码的可读性。

艺术二维码

艺术二维码是将二维码与艺术设计相结合的形式,通过保留二维码的底层技术逻辑(定位、编码、纠错),将数据模块转化为艺术化的视觉符号,既能满足信息交互的实用性,又能实现设计美学的表达。

结语

二维码(QR Code)作为一种高效、可靠的信息载体,其精妙的结构设计体现了工程学与信息技术的完美结合。从定位图案的快速识别,到数据区的灵活编码,再到纠错机制的强大容错能力,每一个功能模块都经过严谨的优化,以确保二维码在各类复杂环境下仍能稳定工作。

无论是日常生活中的扫码支付、物流追踪,还是工业领域的自动化识别,二维码都展现出了极高的适应性和扩展性。

技术的本质在于解决问题,而二维码正是这一理念的杰出代表——用简洁的设计,实现广泛的应用。希望本次分享能让大家更深入地认识二维码,并在实际使用中更加得心应手。