Dev_Eric

新浪微博:卖螃蟹的程序员

导航

二维码详解

一、什么是二维码?

二维码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。通常分为堆叠式二维码和矩阵式二维码。二维码的原理可以简单概括为:在矩阵相应元素位置上用“点”表示二进制“1”, 用“空”表示二进制“0”,“点”和“空”的排列组成代码。现在所看到的二维码绝大多数是“QR码”,QR码是“Quick Response”(快速反应)的缩写,由日本Denso-Wave公司发明。二维码的名称是相对与一维码来说的,相比“一维码(比如条形码)”存储的数据量更大;可以包含数字、字符,及中文文本等混合内容;有一定的容错性(在部分损坏以后可以正常读取);空间利用率高等。这篇文章整理的是QR Code 相关的知识。

QR码的主要优点有:

  1. 存储大容量数据

  2. 在小空间内打印

  3. 可以有效的处理各种文字

  4. 对变脏和破损的适应能力强

  5. 可以从360°任一方向读取

  6. 支持数据合并功能

二、二维码的组成

二维码一共有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 的正方形。QR Code的基本结构如下图:

qr_code

定位图案

  • 位置探测图形(Position Detection Pattern):用于标记二维码的矩形大小,个数为3,因为3个即可标识一个矩形,同时可以用于确认二维码的方向。

  • 位置探测图形分隔符(Separators for Postion Detection Patterns): 留白是为了更好的识别图形。

  • 定位图形(Timing Patterns):二维码有40种尺寸,尺寸过大了后需要有根标准线,不然扫描的时候可能会扫歪了。

  • 校正图形(Alignment Patterns):只有Version 2以上(包括Version2)的二维码需要这个东东,规格确定,校正图形的数量和位置也就确定了。

功能性数据

  • 格式信息(Format Information):存在于所有的尺寸中,用于存放一些格式化数据。表示改二维码的纠错级别,分为L、M、Q、H;

  • 版本信息(Version Information):即二维码的规格,在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。

数据信息和纠错信息

  • 数据信息和纠错信息:实际保存的二维码信息(Data Code 数据码)和纠错信息(Error Correction Code 纠错码)(用于修正二维码损坏带来的错误)。

三、二维码的生成

既然已经知道了二维码的组成,接下来就来学习生如何生成二维码:

1、需求分析

需求分析主要是确定编码的字符类型, 选择纠错等级等。比如确定要生成的二维码的数据类型是什么?

2、数据编码

数据编码就是将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。目前二维码支持的集中数据为:

mode

  • ECI(Extended Channel Interpretation mode):用于特殊的字符集。并不是所有的扫描器都支持这种编码。

  • 数字(Numeric mode):数字编码,从0到9。

  • 字母数字(Alphanumeric mode):字符编码。包括 0-9,大写的A到Z(没有小写),以及符号$ % * + - . / : 包括空格。

  • 8位字节(Byte mode):可以是0-255的ISO-8859-1字符。有些二维码的扫描器可以自动检测是否是UTF-8的编码。

  • 日本汉字(Kanji mode):这是日文编码,也是双字节编码。同样,也可以用于中文编码。

  • 中国汉字

  • 结构链接(Structured Append mode):用于混合编码,也就是说,这个二维码中包含了多种编码格式。

  • FNC1(FNC1 mode):主要是给一些特殊的工业或行业用的。比如GS1条形码之类的。

3、纠错编码

QR码缺一部分或者被遮盖一部分也能被正确扫描,要归功于QR码在发明时的“容错度”设计,生成器会将部分信息重复表示(也就是冗余)来提高其容错度。QR码在生成时可以选择四种程度的容错度(可修正的字码量),分别是L,M,Q,H,对应7%,15%,25%,30%的容错度。也就是说,如果你在生成二维码时选择H档容错度,即使30%的图案被遮挡,也可以被正确扫描。这也就是为什么现在许多二维码中央都可以加上LOGO。

二维码的纠错码主要是通过Reed-Solomon error correction(里德-所罗门纠错算法)来实现的。大致的流程为对数据码进行分组,然后根据纠错等级和分块的码字,产生纠错码字。

4、构造最终数据信息

完成上述操作后,并不是就能直接生成二维码了,还需要进行处理的就是穿插放置数据,比如有4个区块的,那么统一把每一区块的第一列放在一起,然后是第二列。以此类推。

在规格确定的条件下,将上面产生的序列按次序放如分块中。按规定把数据分块,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块按顺序构成一个序列,添加到原先的数据码字序列后面。

5、构造矩阵

将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。

cube

最终编码的填充方式如下:从左下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。

qr-order

6、掩摸图案

按照上面的方法生成的图片可能会不均匀,比如说出现大面积的黑白或黑快,使得扫描变得困难,解决方法是进行(XOR)掩摸操作。QR有8个Mask你可以使用,如下所示:

mark

需要注意的是,掩摸只会和数据区进行XOR,不会影响功能区。具体可以查看里德-所罗门码

7、格式和版本信息
最后一步就是生成格式和版本信息放入相应区域内。版本7-40都包含了版本信息,没有版本信息的全为0。二维码上两个位置包含了版本信息,它们是冗余的。版本信息共18位,6X3的矩阵,其中6位时数据为,如版本号8,数据位的信息时 001000,后面的12位是纠错位。

至此,按照上面大致的流程就可以使生成二维码图片了。由于讲的比较简单,具体的细节可查看这份QR Code标准文档,或者采用比较简单的方式:利用谷歌API进生成二维码

附1:常见二维码生成类库

附2:比较好的二维码生成网站

四、二维码的解读

二维码的扫描总共需要三个流程,分别是条码定位、分割和解码。下面就进行一一的解释。

1、条码的定位

条码的定位就是找到条码符号的图像区域,对有明显条码特征的区域进行定位。然后根据不同条码的定位图形结构特征对不同的条码符号进行下一步的处理。实现条码的定位采用以下步骤:

  1. 利用点运算的阈值理论将采集到的图象变为二值图像,即对图像进行二值化处理;

  2. 得到二值化图像后,对其进行膨胀运算;

  3. 对膨胀后的图象进行边缘检测得到条码区域的轮廓;

下图是经过上述处理后得到的一系列图像:

read-code

2、条码的分割

  1. 修正不完成的边界,分割出一个完整的条码区域。

  2. 通过凸壳计算准确分割出整个符号。

  3. 区域增长和凸壳计算交替进行获取最终图片。

3、解码

  1. 对图像进行网格取样

  2. 根据阀值确认深色块与浅色快

  3. 用”1″和”0″构造位图

  4. 获取二进制序列值

  5. 对数据进行纠错和

  6. 根据编码规则把转换成内容

附3:比较主流的二维码扫描软件

  • 微信

  • 快拍

  • 我查查

五、二维码的商业价值及应用

单纯的二维码的生成和扫描可能一点作用都没有,但是通过各种场景的应用就可以让其发挥价值。

1、实现内容的快速准确输入

目前见得比较多的就是使用二维码生成网址或者手机应用的下载链接,目的也就是实现用户在手机上的信息录入,并且也能保证录入的信息不受人为因素(粗心大意)的影响。比如采用二维码进行跟踪物流包裹来代替人为的记录包裹编号。同时个人名片也是一个很好的案例。只需要手机扫描二维码就可以将名片信息直接诶保存到手机的通讯录。这些信息是直接存在在二维码中的。

2、对信息进行标识

将二维码作为一个信息标识存在在产品或者物品上,方面用户了解物品的详情。目前已经有的应用比如博物馆对藏品打上二维码,用户只要扫描二维码就能打开相关的介绍视频或录音等,从先前的平面化信息转化成影音信息。比如这款多信语言便签。其真实的信息并没有直接存储在二维码中,而是存储了信息的一个链接而已。相当于程序中的“指针”。

3、起到线上线下的后台桥梁

目前做的比较好的比如线下扫描,线上比价,做的比较好的比如“我查查”,将线下的数产品数据和线上的价格数据进行匹配处理和展示。

4、作为电子票务的凭证

比如新版的火车票上的二维码就是属于票务凭证的很好案例。通过验证二维码信息进行身份和信息的验证。通过验证二维码信息的验证来控制闸机。另外目前很多线上预订的景区等,也通过预订后将二维码发送到用户手机号,景区在门口通过电子枪扫描确认有效性。但是由于手机设备大小等不易,类似的流程目前还存在诸多不便。

5、作为身份的验证

具体流程是现在手机上通过相关的权限认证。再通过已验证的信息去关联扫描到的内容。具体案例如微信的二维码登录。支付宝的扫码支付。都是通过手机上已经验证的信息反馈进行身份的验证。

需要注意的是由于二维码复制简单,基本不能起到防伪的作用,但是很多商家利用客户对二维码的不了解,宣传二维码能防伪来欺骗消费者。

六、如何让二维码有想扫的冲动

在对二维码进行推广的时候,需要考虑到如何提升用户的扫码率。主要从两方面进行考虑:

1、场景方面

1)信号好的,或有免费WIFI的地方,没有信号的地方可能扫描出网页也打不开。没有WIFI,可能用户不会去使用3G流量下载你的应用。

2)要用户很闲的场景下,比如用户没事玩手机的时候,比如公交站台。如果用户处理忙碌状态,很少会去扫描身边的二维码。

3)注意印刷的质量,比如印刷在布类上,或者户外的广告上,印刷的不好可能就使条码扫不出来。

2、条码设计

1)表达清楚扫描后会出现什么。告诉用户扫描后会得到什么,比如扫码知道无线密码等。下面的二维码就是一个很好的示例:

qrcode-1

2)不表达清楚扫描后会出现什么。让用户出于好奇心去扫描,比如李勇二维码的容错性,将二维码设计的非常的有个性,比如下图:

qrcode-2

最最忌讳的是将一个平白无奇的二维码直接一放。

七、其他二维码相关问题

1、二维码扫描会使手机中毒?

目前很多手机中毒的原因可能就是使用二维码导致的,其实二维码本身由于数据量的限制很难中毒,很多中毒的原因是手机系统做过越狱或者Root,在此基础上通过扫描安装了一些有恶意程序的APP。所以对于root过的手机用户在扫码下载时一定要注意。

参考链接:

建议继续学习:

    1. 二维码的生成细节和原理    (阅读:8339)
    2. 微信二维码登录的原理    (阅读:4238)
    3. 微信扫码登录网页实现原理    (阅读:2865)
    4. QR二维码的攻击方法与防御    (阅读:1958)
    5. 二维码的未来    (阅读:1666)

posted on 2016-04-08 10:37  Dev_Eric  阅读(3120)  评论(0编辑  收藏  举报