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

初识 QR 二维码(零)相关推荐

  1. Matlab实现 通过检测QR二维码位置探测图案进行精确定位

    近邻点集融合算法 QR二维码结构简介 QR二维码识别中在对图像预处理后最重要的一步就是要进行定位,QR二维码中有三个位置探测图形,通过扫描其特征便可以进行精细定位. 其中位置探测图形的比例特征如下: ...

  2. C# vb .NET生成QR二维码

    二维码比条形码具有更多优势,有些场合使用二维码比较多,比如支付.通过将某些数据生成二维码,就可以实现一码走天下.那么如何在C#,.Net平台代码里生成二维码呢?答案是使用SharpBarcode! S ...

  3. 【OpenCV 4开发详解】QR二维码检测

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  4. OpenCV4.0 快速QR二维码检测测试示例

    点击我爱计算机视觉标星,更快获取CVML新技术 近几年由于微信大力推广移动支付,二维码已经成为手机App的标配,在众多种类的二维码中,QR码是最为流行的. 刚刚发布的OpenCV4.0-Alpha新增 ...

  5. python用二维码共享文档_[源码和文档分享]基于Python的QR二维码的生成与识别程序...

    摘 要 进入二十一世纪之后,高新技术产业得到了极其迅速的发展.计算机.互联网.物联网.云计算等领域的发展,使得整个社会的信息化程度极大提高.随着技术的不断成熟,目前的一维条形码已逐渐向二维码过渡.本课 ...

  6. 摄像头拍照及解析QR二维码

    此项目用C#实现了摄像头拍照及解析QR二维码,下面附上测试截图及部分源码: 拍照功能: 解析电脑拍摄的2D图片,能够正确显示文本信息 using System; using System.Collec ...

  7. 生成QR二维码图片示例

    生成QR二维码图片的简单示例 QR二维码的生成,在生成QR二维条码中已经提及.不过上次是通过网站生成的,缺点是对网站的依赖.下面做了个调用zxing core实现生成QR二维码图片的示例.另外还可以通 ...

  8. C# QR二维码DEMO

    QR二维码 二维码的一种 相关类库 ThoughtWorks.QRCode 第三方类库 DEMO功能 Encode 生成二维码图片 Encoding 编码 Correction Level 等级 Ve ...

  9. 从头开始训练一个检测QR二维码区域的YOLOv3模型

    条形码和二维码在识别的时候主要包含定位和解码两个步骤.寻找码的位置,除了用传统的图像算法之外,也可以借助深度学习.那么深度学习的效率如何,我做了一个实验. 为QR二维码训练YOLOv3模型 编译Dar ...

最新文章

  1. 确定S中最接近中位数的k个元素(算法导论第三版9.3-7)
  2. 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09
  3. Linux(debian7)操作基础(十二)之文件加密使用指南
  4. 不用Oracle?基于MySQL数据库下亿级数据的分库分表
  5. 各种ListView列表方法
  6. python和lua哪个有前途_python和lua数据类型的比较
  7. sdk环境变量配置失败问题
  8. 【Vue】基础入门 —— 黑马程序员
  9. 关闭windows自动更新N种方法
  10. 描述十二个异性追求者的拓展
  11. mysql金额分隔符_mysql分隔符
  12. 在vc2008中用_crtBreakAlloc调试内存泄漏
  13. #智能制造#第一章 智能制造,缘何而起?
  14. Yapi idea插件使用
  15. 为什么气象站和 AI 都测不准天气?
  16. 我竟然被骗了,原来我也是个好人
  17. yourshelf是什么意思中文_lose yourself是什么中文意思
  18. Android平台游戏开发引擎使用指引
  19. 大专和本科学历的区别04
  20. 在Ubuntu20.04上安装Jasper Server7.8.0

热门文章

  1. [笔记]搜索引擎-实验报告-实验二
  2. 【HTML】form标签
  3. form表单的使用,iframe内嵌标签
  4. 电子商务交易过程中的网络安全技术
  5. airpods真假鉴定!!!!!!!!!!
  6. BA--冷源系统原理图解
  7. photoshop cs5 基础教程 路径选择工具
  8. 这就是Tcpcopy
  9. java线上流量复制工具_tcpcopy复制线上流量
  10. 华为扩大内存代码_华为手机增大手机内存代码 | 手游网游页游攻略大全