首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

初识 QR 二维码(零)

提到二维码,想必大家每天都会接触到,扫码支付、扫码添加微信好友等都会用到。关于二维码的生成原理,网上确实有些介绍,但基本涉及到具体编码就一笔带过没有深入了。目前 Python 也有现成的模块可以调用来生成、解析二维码。但我想既然研究的话,还是搞个系列把它琢磨得明明白白比较好。经过一番搜索比较,准备了一系列的素材翻译文章,等到理通整个编码流程,我们再来玩转二维码~

QR 二维码是我们日常中常见的二维码,定义如下:

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。 百度百科-二维码

代码语言:javascript
复制
本文翻译自
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 二维码版本列表包含了每种版本下二维码对应的信息量。

代码语言:javascript
复制
QR 二维码相关网站
https://www.qrcode.com/en/

首先,我们先说一下二维码一共有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 二维码的编码过程。在深入到细节步骤之前,让我们大致浏览下整个编码过程。

1. 编码模式分析

一份 QR 二维码是对一个文本字符串的编码。QR 标准二维码支持 4 种编码文本格式:数字、字母数字代码、字节和日本汉字。每种模式都将文本编码为二进制字符串(一串由 1 和 0 组成的字符),但是不同模式之间将文本转化为二进制所使用的方法并不相同,它们各自不断优化该方法以使用最间断的二进制来对数据进行编码。因此,我们第一步要来做数据分析以决定我们的文本信息究竟以数字、字母数字代码、字节还是日本汉字哪种模式来看待最合适,从而选择最快捷的编码模式。

2. 数据编码

既然已经选择了对文本信息最合适的编码模式,接下来就是对文本编码。数据编码部分将描述不同模式下编码过程细节。通过数据编码过程,最终生成一串二进制码,每段码字长度是 8 位。

3. 纠错码

如上所述,QR 二维码使用了错误校正码,这也就意味着在生成完代表文本的二进制码后,必须要在代码基础上通过 Reed-Solomon 错误校正来生成可纠错的码字。

QR 读码器会同时读取数据码字和错误校正码字。通过比较二者,读码器可以判断其是否准确读码,如果未正确读码将自动校正错误。错误校正码部分将详细介绍生成错误校正码的过程。

4. 构建最终编码

接下来我们要将生成的数据和校错码按照合适的顺序组合到一起。对于大一些的 QR 二维码来说,数据和校错码被生成在区块中,这些区块按照 QR 码的规范交叉存取。该过程我们将在构建最终信息这一部分详细阐述。

5. QR 二维码布局

在生成了数据码字和校错码字并将它们按正确顺序组合后,我们还要将这些码字按特定方式放到 QR 二维矩阵中。在这一过程中,你将接触所有 QR 二维码共有的模式,例如三个角的像盒子似的区块。具体细节将在矩阵模块布局中展开。

6. 掩码

QR 二维矩阵中特定模式会加大读码器正确读取二维码数据的难度,为了解决这个问题,QR 码规范中定义了八种屏蔽格式,其中每种都因为某种格式影响 QR 二维码。我们必须决定哪种掩码模式对 QR 二维码带来的不利因素最少。我们将基于四种处罚规则来评估每种掩码矩阵。我们最终的 QR 二维码将采用产生最低处罚分数的掩码。具体过程将在数据掩码部分介绍。

7. 格式和版本信息

最后一步是在前几步中留出来的空白区域添加像素为 QR 二维码添加格式以及(必要的话)版本信息。格式像素将指明校错级别和用到的掩码格式。版本像素将 QR 二维矩阵的尺寸编码,通常只用在较大的 QR 二维码中。关于最后一步的细节,请参阅格式和版本信息部分。

注:第 7 步中的格式和版本信息其实在第 6 步掩码时已经会用到了,所以我将其内容添加在第 5 步结尾部分。

代码语言:javascript
复制
本文翻译自
https://www.thonky.com/qr-code-tutorial/introduction

中文参考文章:《二维码的生成细节和原理》
http://blog.sae.sina.com.cn/archives/1139

本文手工翻译不算原创,如有侵权也欢迎联系,如有不恰当地方欢迎指正;同时关于二维码有奇思妙想也可以留言反馈~

下一篇
举报
领券