Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

二维码小知识,node实现彩色二维码 #12

Open
xuqinggang opened this issue Nov 27, 2018 · 0 comments
Open

二维码小知识,node实现彩色二维码 #12

xuqinggang opened this issue Nov 27, 2018 · 0 comments

Comments

@xuqinggang
Copy link
Owner

xuqinggang commented Nov 27, 2018

二维码小知识,基于node-qrcode实现彩色二维码

主要利用**qrcode进行了一些业务要求的功能扩展,实现彩色二维码**

对前端来说,有很多库可以实现展示二维码,设置logo、前景色背景色之类。比如:

  • qr-image纯js实现
  • qrcode很强大,也支持node端,但不支持设置logo
  • awesome-qr更加多样性,在浏览器端支持设置logo,背景图。但在node端不支持设置logo,背景图

其实这些库支持在浏览器端设置logo,基本上都是利用canvas,把logo图绘制上去的
所以在node端有node-canvas,所以在node也可按浏览器那种方式利用canvas绘制logo,如下图
image


其实已经有了这么多的库,已经可以满足我们各种各样的需求,但是满足不了PM的呀~.~。因为有了pm,所以有了接下里的二维码调研+实现。
因为此处二维码的功能是用海报系统对接的,所以实现一个最简单的二维码或者带logo的二维码都很容易

但PM要实现一种像后端一样的好看的二维码(上图三),为了满足PM,决定对海报系统的二维码进行优化。所以要对二维码原理有所了解,下面先讲解下二维码基本原理(编码+识别)不对具体实现做讲解,然后讲下如何利用node实现(如上图三)美化后的二维码.

二维码QRCode基本原理

二维码,基本可分为行排式二维条码和矩阵式二维条码。行排式二维码就是一维条形码,矩阵式二维码,最流行的就是QRCode,具有代表性的矩阵式二维条码有:Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix 等。QRCode 全名是 Quick Response Code,是一种可以快速识别的二维码。

1. Version、尺寸

QRCode 有不同的 Version ,不同的 Version 对应着不同的尺寸。将最小单位的黑白块称为 module。
常见的 QRCode 一共有40种尺寸:

  • Version 1 : 21 * 21 modules
  • Version 2 : 25 * 25 modules
  • Version 40: 177 * 177 modules

QRCode 尺寸的公式如下:

*Version V = ((V-1)4 + 21) ^ 2 modules。可以看出是从21开始,以4递增的。
尺寸越大,所能编码的信息就越多。一般我们不需手动指定version,会自动根据我们所编码的信息,选择相应的Version

2. 二维码结构组成

image

2.1 功能图形

功能图形是不参与编码数据的区域。它包含空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形五大模块。

  • 空白区:留白的地方。qrcode-margin的设置,默认4
  • Position Detection Pattern(位置探测图形):位于三个角落,可以快速检测二维码位置,帮助我们从任何角度(斜着,倒着)扫码的时候,都能快速识别
    image
    Structure of Position Detection Pattern,如下图,可以看出所占的module比例,很重要(后面我们要据此找到最中间的3x3的module绘制随机色)
    image
  • 附带讲下,module(码元):QRCode中最基本的单位,前景色(黑色)为1,背景色(白色)为0。默认情况下每个module由4x4个像素组成(由qrcode-scale设置
    Notice: 但如果我们设置了宽度,module可以是浮点数x浮点数个像素组成(qrcode-scale计算
  • 位置探测图形分隔符:主要作用是区分功能图形和编码区域。
  • 定位图形:它由黑白间隔的各自各自组成的线条。主要用于指示标识密度和确定坐标系。原因是 QR 码一种有 40 个版本,也就是说有 40 种尺寸。每种二维码的尺寸越大,扫描的距离就越远。
  • 校正图形:只有 Version 2 及以上的QR码有校正标识。校正标识用于进一步校正坐标系。
2.2 编码区域

编码区域是数据进行编码存储的区域。它由格式信息、版本信息、数据和纠错码字三部分构成。

  • 格式信息: 所有尺寸的二维码都有该信息。它存放一些格式化数据的信息,例如容错级别、数据掩码,和额外的自身 BCH 容错码。
  • 版本信息:版本信息是规定二维码的规格。前面讲到 QR 码一共有 40 种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。
  • 数据和纠错:主要是存储实际数据以及用于纠错码字。

纠错能力:对变脏和破损的适应能力强
QR码具备“纠错功能”,即使部分编码变脏或破损,也可以恢复数据。数据恢复以码字为单位(是组成内部数据的单位,在QR码的情况下,每8比特代表1码字),最多可以纠错约30%(根据变脏和破损程度的不同,也存在无法恢复的情况)。
二维码有如下四种纠错级别
ERROR_CORRECT_L:大约<=7%的错误能纠正过来
ERROR_CORRECT_M:大约<=15%的错误能纠正过来
ERROR_CORRECT_Q:大约<=25%的错误能纠正过来
ERROR_CORRECT_H:大约<=30%的错误能纠正过来
当纠错级别越高时,二维码能容纳的数据量就越少。正是因为二维码具有一定的纠错能力,所以在二维码中间覆盖一层logo是没有问题的,只要控制好覆盖面积。
以25%的纠错级别为例,中间logo所占二维码的最大比例为25%x25%=0.0625,所以有时候要重新计算logo宽高
image



以上只对二维码基本概念做了些讲解,具体二维码编码过程不讨论(没了解透)
了解了一些基本概念,其实也可以实现PM的基本需求了,随机色+logo。
附:二维码为什么可以彩色?(简单来说,是通过灰度化和二值化,即把彩色图片经过灰度化和二值化变成只有黑白(只有0,1的矩阵)的数据,具体涉及到图像处理)
下面基于qrcode库用node实现彩色二维码+logo,具体请看


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant