提到二维码,想必大家每天都会接触到,扫码支付、扫码添加微信好友等都会用到。关于二维码的生成原理,网上确实有些介绍,但基本涉及到具体编码就一笔带过没有深入了。目前 Python 也有现成的模块可以调用来生成、解析二维码。但我想既然研究的话,还是搞个系列把它琢磨得明明白白比较好。经过一番搜索比较,准备了一系列的素材翻译文章,等到理通整个编码流程,我们再来玩转二维码~
QR 二维码是我们日常中常见的二维码,定义如下:
二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。------百度百科-二维码
接下来是我最近翻译的关于二维码的素材。
本文翻译自
https://www.thonky.com/qr-code-tutorial/introduction
QR 二维码是一类可以将像数字、字母和日文等信息编码的特殊条形码。本教程向大家展示如何通过编码制作一个 QR 二维码。编码过程较为复杂,特别是在生成错误校正码的时候一定当心。本篇将尽量用简单的语言来解释整个过程,当然,前提是你得至少有些编程的基础知识。
历史和信息
QR 二维码在 1994 年诞生于日本丰田(Toyota)一家生产汽车零部件的子公司 Denso-Wave 。QR 二维码标准被定为 ISO/IEC 18004:2006,其使用是免授权的。
最小的 QR 二维码是 21x21 像素,最大的是 177x177 像素。尺寸决定了版本:21x21 像素尺寸是第一版,25x25 是第二版,每多4个像素版本加一,以此类推,177x177 是第四十版。
此外,QR 二维码包含了错误校正功能:当你编码 QR 格式时,你也会创造许多冗余数据,从而使 QR 扫码器即使在缺失部分二维码的情况下也能准确读取 QR 二维码的数据。
QR 二维码提供四种可选的错误校正级别:最低级的是 L,即使缺失 7% 仍可读;更高一级的是 M,允许缺失 15%;之后是 Q,可以达到 25%;最高级是 H,在缺失 30% 区域的情况下仍可以正常读取二维码信息。
一个给定的二维码的能力取决于其版本和错误校正级别,同时也要看你要拿它来编码的数据类型。QR 二维码可编译的数据模式有四种:数字,字母数字代码,二进制,日本汉字。Denso-Wave 网站上 QR 二维码版本列表包含了每种版本下二维码对应的信息量。
首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)*4 + 21(V是版本号) 最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形。
左耳朵耗子,2013,http://blog.sae.sina.com.cn/archives/1139
编码过程概述
接下来我们将要细致阐述 QR 二维码的编码过程。在深入到细节步骤之前,让我们大致浏览下整个编码过程。
- 编码模式分析
一份 QR 二维码是对一个文本字符串的编码。QR 标准二维码支持 4 种编码文本格式:数字、字母数字代码、字节和日本汉字。每种模式都将文本编码为二进制字符串(一串由 1 和 0 组成的字符),但是不同模式之间将文本转化为二进制所使用的方法并不相同,它们各自不断优化该方法以使用最间断的二进制来对数据进行编码。因此,我们第一步要来做数据分析以决定我们的文本信息究竟以数字、字母数字代码、字节还是日本汉字哪种模式来看待最合适,从而选择最快捷的编码模式。
- 数据编码
既然已经选择了对文本信息最合适的编码模式,接下来就是对文本编码。数据编码部分将描述不同模式下编码过程细节。通过数据编码过程,最终生成一串二进制码,每段码字长度是 8 位。
- 纠错码
如上所述,QR 二维码使用了错误校正码,这也就意味着在生成完代表文本的二进制码后,必须要在代码基础上通过 Reed-Solomon 错误校正来生成可纠错的码字。
QR 读码器会同时读取数据码字和错误校正码字。通过比较二者,读码器可以判断其是否准确读码,如果未正确读码将自动校正错误。错误校正码部分将详细介绍生成错误校正码的过程。
- 构建最终编码
接下来我们要将生成的数据和校错码按照合适的顺序组合到一起。对于大一些的 QR 二维码来说,数据和校错码被生成在区块中,这些区块按照 QR 码的规范交叉存取。该过程我们将在构建最终信息这一部分详细阐述。
- QR 二维码布局
在生成了数据码字和校错码字并将它们按正确顺序组合后,我们还要将这些码字按特定方式放到 QR 二维矩阵中。在这一过程中,你将接触所有 QR 二维码共有的模式,例如三个角的像盒子似的区块。具体细节将在矩阵模块布局中展开。
- 掩码
QR 二维矩阵中特定模式会加大读码器正确读取二维码数据的难度,为了解决这个问题,QR 码规范中定义了八种屏蔽格式,其中每种都因为某种格式影响 QR 二维码。我们必须决定哪种掩码模式对 QR 二维码带来的不利因素最少。我们将基于四种处罚规则来评估每种掩码矩阵。我们最终的 QR 二维码将采用产生最低处罚分数的掩码。具体过程将在数据掩码部分介绍。
- 格式和版本信息
最后一步是在前几步中留出来的空白区域添加像素为 QR 二维码添加格式以及(必要的话)版本信息。格式像素将指明校错级别和用到的掩码格式。版本像素将 QR 二维矩阵的尺寸编码,通常只用在较大的 QR 二维码中。关于最后一步的细节,请参阅格式和版本信息部分。
注:第 7 步中的格式和版本信息其实在第 6 步掩码时已经会用到了,所以我将其内容添加在第 5 步结尾部分。