专栏首页用户6811391的专栏初识 QR 二维码(零)

初识 QR 二维码(零)

提到二维码,想必大家每天都会接触到,扫码支付、扫码添加微信好友等都会用到。关于二维码的生成原理,网上确实有些介绍,但基本涉及到具体编码就一笔带过没有深入了。目前 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 二维码版本列表包含了每种版本下二维码对应的信息量。

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 步结尾部分。

本文翻译自
https://www.thonky.com/qr-code-tutorial/introduction

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

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

本文分享自微信公众号 - TTTEED(TEDxPY),作者:TED

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手绘二维码攻略

    提到二维码想必大家都不陌生,扫码支付、添加好友以及关注公众号等,随处可见二维码身影。通常我们见到的二维码会有三个用于定位的黑白嵌套的方块,这基本上就是 QR 二...

    TTTEED
  • QR 编码模式分析(一)

    一个 QR 二维码其实是一串文本信息的编码。QR 二维码的标准支持以下四种编码模式:数字编码、字符编码、字节编码和日文编码。每种模式都将文本编码为一串由 0 和...

    TTTEED
  • QR 数据编码详解(二)

    每种编码模式针对其字符,不断优化以产生最短的编码二进制串。在此过程中它们采用的编码方法是不同的,本篇将主要解释数据编码过程。

    TTTEED
  • 手绘二维码攻略

    提到二维码想必大家都不陌生,扫码支付、添加好友以及关注公众号等,随处可见二维码身影。通常我们见到的二维码会有三个用于定位的黑白嵌套的方块,这基本上就是 QR 二...

    TTTEED
  • 二维码会使用完么?

    现在生活中总是会使用到二维码,在支付中、博客的推广图片上、各种各样的商品推广,都有着二维码的身影,二维码已经是我们的日常生活中有着不可替代的便捷信息载体,近几日...

    Debug客栈
  • 一行python代码生成酷炫/恶搞/表白二维码(内附源码)

    很多人都扫过二维码,大部分人的印象都是黑白相间的小方块,实际上二维码是运用了计算机图像处理技术,组合编码原理的一种编码,其用黑白像素点的图像来代表二进制中的“1...

    行哥玩Python
  • Java 快速开发二维码生成服务

    不知道从什么时候开始,我们的生活突然之间就充满了二维码,连街边大妈的鸡蛋饼早餐摊也贴上了二维码。而且这次疫情的管控也用上了二维码,避免手工填写造成交叉感染。那么...

    码农小胖哥
  • 走近科学:二维码真的安全吗

    二维码自普及以来,无论是从它的便捷性,还是其安全问题,一直都是公众关注的焦点问题。“码”时代来势迅猛,不可阻挡,似乎一夜之间,二维码即遍布各电商平台、商场、网站...

    FB客服
  • 还可以这样玩!一键生成「专属二维码」,就靠这 4 款小程序

    今天,知晓程序(微信号 zxcx0101)给你推荐 4 款二维码生成器小程序,让你轻松玩转二维码。

    知晓君
  • 在二维码生成软件中如何生成PDF417二维码

    Pdf417码,是二维码中比较特殊的码制,可以用来表示数字、字母、汉字或二进制数据。PDF417码最大的特点是信息容量大,纠错能力强,印刷要求不高,普通打印设备...

    用户5746110

扫码关注云+社区

领取腾讯云代金券