从第八章开始
8 结构化添加
8.1 基本原则
结构化添加不适用于MICRO-QR Code符号。
版本16以上的qrcode符号可能会使用结构化添加格式。如果一个符号是由多个结构化信息拼凑出来的,那么它会在前两个半符号字符位置标识出来。
结构化添加模式标识符号0011,会在符号的第一个字符 大端位置的前四个比特中放置。
在此之后,立刻跟上两个结构化添加字,放置在第一个符号字符的四个小端比特位置。符号的第二个字符和 符号第三个字符的大端位置。 第一个字是符号序列的标识,第二个字是数据校验位,并且所有的信息都是相同的。这样可以验证所有的符号都是一致的,以至于可以构成同一个结构化添加信息。上述的头部信息后面会立刻跟上数据编码字,并且连接第一个模式标识符。 如果存在一个或者多个非默认的ECI,那么每个ECI模块(由ECI模式指示符和ECI 设计符组成)都需要加上头部信息。
上图的说明29,就是一个例子。 这个例子将下面的四个二维码拼接成了一个完整的结构性添加二维码。
8.2 符号序列标识
当前说明的这个码字 标识了 二维码符号属于结构化添加格式的部分中的位置(版本16以上)(在n个符号中第m个位置)
前四个比特标识了 当前符号在整个符号中的位置,后面的四个比特标识了当前图形拥有多少位置。
每四个比特 应该用来展示 m-1 和 n-1的二进制模式展示
举个例子: 标识在7个符号中的第三个符号位置,应该是下面的编码
第三个位置 0010
一共七个符号 0110
最终的bit模式 00100110
8.3 奇偶校验数据
奇偶校验数据是一个8比特的字节,跟在符号序列标识后面。奇偶校验数据是通过对尚未拆分的原始数据进行字节模式下的xor运算操作获得。模式标识符,字符长度标识,填充比特,和填充字符 排除在计算之外。输入的数据会被当做双字节的KIS标识或者表6中涉及的其他8比特方式,所有的字节都会被分别XOR操作,大端模式。
在ECI模式下,字节数据可以在被任何压缩和加密之后的进行运算。
举个例子 “0123456789日本”,会被拆分为 "0123" “4567” 和"89日本"。就像下面这样:
第一个 模块 "0123" 16进制标识是 30,31,32,33
第二个模块 “4567” 16进制的标识是 34,25,36,37
第三个模块 "89日本"的 16进制标识是 38,39,93FA,967B
奇偶校验数据是各个字节之间的xor,最终得到结果
注意,校验数据的计算过程,不关心原始数据是否已经发送给显示器,打印机等输出设备,其能否正常输出,取决于设备自身的兼容性。
9 符号的打印和绘制
9.1 尺寸
QR code 符号应该遵循下面的尺寸定义:
X 尺寸: x是应该有应用程序来指定的模点大小, 应用程序 应该考虑到扫描技术的运算需要,以及符号生成技术的需要。
Y尺寸: 需要和X尺寸一致
最小静默区域: MICRO QR 需要两个模点单位, QR Code 需要四个模点单位。 每条边。
9.2 人类可读性解析
因为QR Code符号被设计用于可以储存数千字符,所以人类的可读性实现可能无法实现,作为一个弥补方案,使用描述性文本,而不是逐字文本来伴随符号,是更好的选择。
字符的字体和大小都没有被指定,并且文本消息可能会放置到符号区域的任何地方。但是这些人类可读性的解释措施,不应该干扰符号的静默区域。
9.3 绘制指南
QR Code 符号的打印或者绘制 有很多种不一样的实现技术,附件K 提供了这些用户指南
10 符号质量
10.1 理论说明
QR Code符号的打印质量 应该使用在ISO/IEC 15415中定义的 关于2D矩阵条形码的打印指南。下面的内容作为增强和修改。
有一些打印技术实现可能 因为没有采取特殊的预防措施,所以没法完全遵循国际标准。附录M 提供了一份额外的指南手册,帮助这些打印系统实现有效的QR 符号图形。
直接标记技术(DPM)或者类似的 模点数据无关系的打印符号技术,可能不符合理论说明要求,并且可能不会被扫描器识别。支持此种技术符号的应用程序需要一些特殊的质量处理措施,这些错误在 ISO/IEC 15415的质量拓展文档 ISO/IEC/TR 29158中有约定。 并且解析器同样需要实现这些特殊处理。
10.2 符号质量参数
10.2.1 固定模式损坏
附件G中定义了对于固定模式损坏的处理措施,和评分标准
10.2.2 扫描评分和整体符号评分
扫描评分应该是符号最低的评分,从的对比,调节,固定模式损坏,解码,轴对称均匀性,网格均匀性和无用的错误纠正码在每个单独符号中的评分。整个符号的整体评分是多个单独测试图像评分的平均数。
10.2.3 网格不均衡性
网格的概念是指 通过使用定位符号和修正符号作为基准点来进行定位计算的,具体解码算法参看 条约12
10.3 流程控制措施
有很多的工具和方法可以用来作为有效的措施,用来监控和控制创造二维码符号的流程。他们在附件M中有描述。这些技术并没有组成 生成二维码打印技术检查的标准(这些方法在当前条约的早些部分以及有声明,以及附件G中需要这些方法去评估符号的打印质量)但是他们单独或者一起 可以很好的标识符号的打印流程是否很好的生成了很好的符号。
11 解码步骤 一览
本章节说明了从一张二维码符号中读取输出字符的解码步骤,它是编码步骤的反转过程。说明20 展示了这个流程图。
1 从图像元素中,定位并且截取到符号的部分。 识别其中的深色,浅色模点,将其组成 0,1组成的比特序列。识别反射极性通过对定位符号色彩的识别。
2 读取(比特序列中的)格式信息,释放其中的遮罩层信息并且根据其中的纠错码得到格式信息模点。 如果这个时候成功了,说明当前是正常的方向,否则尝试从景象图像中读取格式信息。直接,从其中读取纠错码级别或者数据遮罩模式。在QR符号中,或者从MICRO QR符号数字中。
3 读取其中的版本信息(取决于应用程序),然后决定符号的版本。(如果是MICRO QR,则取决于区号的模点数量)
4 通过读取格式符号信息中其他信息,得到数据遮罩符号。 通过数据遮罩符号进行xor操作,解码得到编码区域的比特序列。
5 根据编码的排版规则读取符号的字符,还原数据和纠错码字组成的消息内容。
6 根据纠错码级别信息,拾取纠错码字当中的错误。如果发现存在错误,则纠正它。
7 根据数据中的模式标识符和数量标识符,将拆解出来的数据分别放置到对应的片段。
8 最终,根据模式还原到最终的数据,并且输出。
12 QR 解码算法相关内容。
本章节用来介绍解码算法,用来从图像中找到符号,并且解析他们。下面是用来解析黑白模点状态的算法相关。
a) 决定一个全局的阈值,通过计算最大影响率和最低影响率得到一个中位数。通过使用这个公共阈值,将图像转换为由黑白像素构成的集合。(也就是二值化图像)
b) 找到定位符号的位置。QR符号中的定位符号是由三个分布在四个角落的特殊符号组成的。在MICRO符号中他是一个单独的定位符号。 就像6.3.3中所描述的,每个符号定位都是由 单位宽度的 黑白黑白黑序列组成的,他们元素之间的宽度关系是 1:1:3:1:1.对于算法期望容忍,对于他们宽度是0,5(比如 对于一个单独的模点位置的宽度是0.5-1.5之间,对于三个模点方向矩阵的宽度范围是 2.5-3.5)
1) 当一个候选区域被发现的时候,需要标注其中首个和最后一个点的位置。 设其为A,B。 并且将其作为定位符号的边界进行像素的连线(参看说明31)。重复对临近的像素进行上述的操作,直到X轴上识别符号中间的黑色方块被识别出来。
2) 重复步骤1的操作,在Y轴上实现定位符号中心的方块。
3) 找到定位区域中间的位置,根据X轴上的A,B之间,从最外侧的中间点构造出来穿过中心区域的X坐标,通过构造类似AB最外面的像素点之间Y坐标上的像素点,最终得到这些线之间的交际。
4) 重复1-3的步骤,找到其他两个定位符号的中心
5) 如果没有找到候选的区域,尝试反转亮色和暗色像素的着色方式。从b步骤重新开始尝试解码整个符号,通过对(元素的)反转
6) 如果只找到了一个定位符号,但是另外两个较远的定位符号没有找到,则尝试按照MICRO QR符号去解析。其解析的步骤跳过MICRO QR本应该有的步骤(从m开始)
c) 通过解析左上角定位符号中心的笛卡尔坐标,确定整个符号的旋转角度和方向。
d) 通过左上角的定位符号和右上角的定位符号确定 第一个距离D 也就是整个符号的宽度,以及 WUL 和 WUR的距离,在说明32中描述的。
e) 通过下面的公式,计算出符号中x的单位距离
f) 暂时确定符号的版本
g) 如果刚才暂时确定的符号版本小于6,那么就将按照定义制定的版本。如果暂时确定的符号版本大于7或者更多。那么信息的版本将会按照下面的步骤进行解码。
1) 将右上交定位符号的宽度 WUR 除以7,得到单个模电的尺寸 CPUR
2) 定义出引导线 AC和AB。 通过连接A,B,C。这个三个点也就是三个定位符号的中心点。 就像说明33所示。整个符号的所有模点矩阵网格就是由这些基准线和其他水平线决定的。 单位模点的宽度是CPUR,二进制数据的0,1数值则取决于亮色还是深色模点。
3) 找到并且纠正错误,确定符号的版本,如果没有则按照附件D2中描述运算。
4) 如果发现的错误数量超过了纠错容量。那么重新计算WDL的数值,按照相似的步骤去进行上述的a),b) c),去解码符号中的第二处版本信息。
h) 对于版本1的符号来说,定义x的宽度,通过计算上边界终结符的黑白模点的平均宽度实现。相似的方法,通过左侧的终结符计算出Y的数值。封装符号的网格给予1 从与 上边界 上面 符号平行的水平线线,并且按照Y的空间,包含六条平行线 。 2) 纵向上也是类似的操作。
这样的操作取决于符号的版本。 对于版本2以及以上的版本,需要从各个矫正符号的中心确定他们的笛卡尔坐标。具体的说明看6.3.6和附件E,进而依靠这些点构建符号的等距离网格线。
1) 使用左上角的WUL 除以 7 得到单个模点数值CPUL
2) 我们可以,确定修正符号中心 P1,P2的临时笛卡尔坐标 (参看说明33)。 根据左上角的定位符号 PUL的坐标中心点 A,绘制平行引导线 AB和 AC 在7c) (???) 的位置. 以及已知的单个模点的尺寸CPUL
3) 扫描P1,P2所在的修正符号 白色的方形的外边框,从刚才临时中心像素向外找到 中心点的坐标 xi和 yj(参看说明35)
4) 根据左上角的修正符号PUL的临时内部坐标,以及通过步骤3推理得到的P1,P2。进而推测出来修正符号中心P3的坐标
5) 按照步骤三类似的步骤,找到修正符号P3的真实中心坐标
6) 得到lx,也就是p2至p3的修正符号中心点之间的距离。ly 是p1到p3中心点修正符号之间的距离.使用lx 和ly 去除以定义好的修正符号的空间,进而得到修正符号模点在 底边的斜度cpx,以及在右侧的斜度 CPY。参看说明36.
上面公式中提到的AP的数值是修正符号中心符号的模点宽度。
一样的情况,计算出Lx' ,也就是点 pul 和 点p1 中心点中间的横向距离。计算出Ly‘ 也就是点pul 和点 p2 中间点之间的纵向距离。使用下面的公式,对LX' LY'进行除法运算,进而得到符号中 上边界在左边的斜度CPX 以及左边界在上边界上的斜度CPY.
7)基于左上角针对各个边界的模点斜度CPX,CPX' CPY CPY' 确定左上角采样网格区域。
8)使用同样的算法,确定右上角的采样网格区域(通过右上角的定位符号 PUR,以及修正符号P1,P3,P4覆盖的区域)以及左下角的采样网格区域(左下角定位符号PDL,以及P2,P3P5 覆盖的区域)
9) 对于修正符号P6,(就像说明37中描述),推测出其临时的中心点,根据已有的斜度 CPX' CPY'。 而其中的斜度可以根据P3,P4,P5,他们的中心点连接起来的引导线,P3与P4,P3和P5来计算得出。
10) 重复5)至8)之间的步骤。来确定右下角的采样网格区域
11) 符号上其他没有被覆盖的区域,也应该给使用与采样网格一直的规则。
i) 取一个3x3的图像像素块作为样本,找到其中交叉线的中心点,并且根据全局因子,来确定其是亮色还是暗色模点。进而构造出一个比特矩阵,深色为1,亮色为0.
j) 解码左上角定位符号相邻的格式信息,就像附件C.3中所描述的那样,进而得到纠错界别,以及应用于符号的数据遮罩模式。 如果这里的信息中,错误数量超出了可以纠错的限制,那么就使用同样的步骤去读取右上和左下角的格式信息。
k) 如果上面的操作无法得到一个有效的比特串,那么尝试反转过来读取。如果可以成功读取,那么默认其是一张镜像图片,则需要讲图像的横纵坐标进行转换解析。
l) 跳转到步骤Y
m) 对于micro qr符号格式,通过解析步骤b)3)来确定符号针对符号传感轴的可能的相对旋转角度,作为θ(具体步骤看说明38)θ + 90,θ + 180 θ+270 等
n) 绘制三条平行于定位符号各轴的线,平分空闲区域,并且各条线测量点A到点B的距离。行距并没有严格的约定,但是只有三行。
o) 根据步骤n)中计算出来的三个 A点至B点的距离,取其七分之一 作为模点的临时数值X( TODO)
p) 依次取定位符号每条边界的 外边界,在定位符号外侧的所有方向做怕平行于边界,但是距离边界 0,5 X距离
q) 检索下面的终止符号:
1) 确定定位符号,名义上的两条边界,以及他们之间公用的垂直线。
i) 在每个方向上清理出一个至少1,5X的区域
ii) 修正定位符号边界为中心向外 1X区域内的 亮色以及暗色区域 在相对的方向(一个约定的分割区域)
2) 检查,所有的终止区域的黑色模点数量是一致的,他们的数量应该是在2-5之间。
r) 根据间隔符号中黑色元素的数量,确定符号的临时版本信息
2个黑色元素 版本是M1
3个黑色元素 版本是M2
4个黑色元素 版本是M3
5个黑色元素 版本是M4
s) 从黑色符号中心,继承一条平行于间隔符号的直线,到达相邻的定位符号。从而与其他的边,构成一个横切出来的3x3像素的点阵。并且在每个1像素间隔中判断其属于亮色还是暗色状态,从而得到所有模点的格式信息。接着将黑色模点当做1,亮色模点当做0,解码得到比特串。
t) 根据遮罩标示,对数据进行xor操作,根据7.9.2给出的遮罩信息,并且根据附件B 提供的数据进行纠错(如果有必要)这些操作取决于符号的数量(版本和纠错码级别),以及符号应用的数据遮罩模式。
u) 如果格式信息不是一个有效的比特串,判断其是否是一个有效的句子的方法是尝试反方向解读这个句子,就像图片的镜像那样对横纵进行转换,如果与在 附录C中的替代物 不超过两个比特的差异。那么解码其中的格式信息,并且获取其中的符号数量以及数据遮罩层。
v) 确认得到模点数X 从各个边界到定位符号的距离,从各个定位符号的外边界的横切面到静默区域的外边界的最后一个黑色模点,也就是分隔符号的距离,除以符号版本对应的模点数量
x) 构建一个3x3的图像像素点,中心点位于网格线的中间,并且根据全局因子确定各个模点是暗色还是亮色。构造一个比特矩阵,将黑色当做1,亮色当做0.
y) 对数据遮罩区域,进行xor操作,通过释放数据遮罩操作。并且根据纠错码信息还原符号数据。 反转数据遮罩的操作使用的是编码是使用的步骤。
z) 根据7.7.3中的约定,确定各个码字放置的位置。
aa) 需要根据符号的版本以及就纠错码信息,将码字序列重新规划为块。 这里的操作是 7.6 步骤3的反向操作。
bb) 根据附录B中的错误检查和纠正解码操作,对符号进行纠错。 这里的纠错只能处理版本和纠错码级别所约定的最大数值。
cc) 通过各个数据块,还原得到原属信息的比特流
dd) 横向穿织比特流进入各个碎片段,根据模式标识位置,以及长度。 长度取决于模式表示符号后面的字符长度标识
ee) 根据编码模式,强制解析各个碎片段
13 自动识别能力
QR CODE 可以通过其他数据一起 被使用在在数据自动识别环境中(详见附件L) 虽然模型1和其他QR code符号可以通过格式信息遮罩模式来自动识别,但是Model 1 符号不应该被用于QR 符号相同的场景。
14 传输数据
14.1 一般原则
所有的数据字符都应该被数据传输,功能符号,格式和版本信息,纠错码字符,填充字符和保留字符可不应该被传输。默认的传输模式是字节传输
结构化添加模式下的头部信息不应该被传输,如果解码器在缓存模式下进行操作时曾经在传输数据前重新构造完整的数据。 如果解码器使用的是无缓冲模式,那么结构化添加头应该在每个符号的前两个字节上被传输。
对于扩展通道解释的更多复杂操作,包括数据传输。会在下面进行提及。
14.2 符号识别
ISO/IEC 15424标准文档中提供了标准流程去上报以及读取到的符号,通过解码器设置的参数集合,以及其他符号中遇到的特殊符号。
一旦,数据中发现结构化添加数据(包括ECI),那么传输时,会在开始的位置上添加合适的标识符号。如果要去使用ECI模式,那么查看附件F,符号标识符号和参数数值,选择应用于QR CODE符号。
14.3 扩展符号解释器
在支持ECI模式的系统中,每次数据传输都要添加符号识别符号,每次当遇到ECI模式标识符号时,需要用 0x5C 进行转义(在ISO 8859-1中用反斜杠标识,在JIS X 0201中用 💴标识)这个关键字的出现,意味着ECI 指示器已经按照表4中的约定,转换成了一个六位的数字。这个六位数字将会被一个8比特长度,范围i在0x30-0x39之间跟在转义字符之后的数值标识。
应用程序软件在识别到 /nnnnnn, 这样的六位转义字符后的字符串的时候,都会把他当做ECI.直到:
1 编码数据部分结束
2 遇到了一个新的ECI标识 0111,这意味着一个新的子ECI项目。
当默认的解码器在解码数据时,如果遇到转义字符,则需要讲其后的数据原样输出。
如果编码数据中需要使用 0x5C,那么遵循下面的原则: 传输数据时书写两次。 这样无论何时,当出现一次0x5C认为其是转义字符,出现两次则认为其代表有价值的数据。
在结构化添加模式下,当ECI模式标识符开始之后,其后面的所有的数据都会被ECI解释器强制转换,直到(ECI)符号结束。
14.4 FUNC1
在包含FUNC1模式下的,不管是第一个还是第二个位置,相关的字符都能直接传输比特数值,因此需要相关的特殊标识(]Q3,]Q4,]Q5,]Q6) 这些内容在附件F中定义。其他地方可能会遇到相关的应用符号作为数据区域的间隔符号,%代表字符,GS(ASCII/JIS8 中数值是0x1D)代表字节模式。 在所有的情况下,解码器都应该传输 ASCII/JIS8 的数值0x1D
如果在FUNC1模式下,需要在 数字英文混合模式下对字符 %进行编码,则需要使用 %%表示。解码器遇到这种情况时,需要把他当做一个单个%字符。