qrcode源码修改,输出企业微信二维码

关键字: qrcode.js qrcode 企业微信二维码 二维码生成原理

简单修改qrcode.js源码,可以输出企业微信二维码。
关键在于修改各个点的间距,先来了解下二维码的生成原理

二维码生成原理

二维码基本结构

  • 位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;

  • 校正图形:规格确定,校正图形的数量和位置也就确定了;

  • 格式信息:表示改二维码的纠错级别,分为L、M、Q、H;

  • 版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。

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

qrcode源码浅析

  • 根据上述二维码基本结构,可以来分析下部分图形的生成代码
  • 从函数makeImpl开始
  • 初始化码点矩阵
    this.moduleCount = 4 * this.typeNumber + 17
    this.modules = new Array(this.moduleCount)
    for (var r = 0; r < this.moduleCount; r++) {
      this.modules[r] = new Array(this.moduleCount)
      for (var o = 0; o < this.moduleCount; o++) {
        this.modules[r][o] = null
      }
    }
    

setupPositionProbePattern 函数用来标识位置探测图形
setupPositionAdjustPattern 函数用来标识校正图形

  • 其他复杂的过程可以略过
  • 最终码点的绘制是在draw函数中的fillRect
  e.prototype.draw = function (oQRCode) {
    var _oContext = this._oContext
    var _htOption = this._htOption
    ...
    ...
    _oContext.fillRect(
      nLeft,
      nTop,
      nWidth / 1.5,
      nHeight / 1.5
    )

实现企业微信名片的二维码

  • 如何实现企微名片的二维码样式呢?
  • 其实无非就是在标准二维码样式上,除三个位置探测图形和右下角的校正图形外,让码点与码点之间的距离稍微增大1.5倍
  • 关键就在上述几个函数中
  • 首先声明二维数组modulesPosition来存放三个位置探测图形和右下角的校正图形的位置信息
  • 在makeImpl函数中的初始化矩阵中,我们可以初始化
    this.modulesPosition = new Array(this.moduleCount)
    for (var r = 0; r < this.moduleCount; r++) {
      this.modulesPosition[r] = new Array(this.moduleCount)
      for (var o = 0; o < this.moduleCount; o++) {
        this.modulesPosition[r][o] = null
      }
    }
    
  • 在setupPositionProbePattern函数中内层循环中进行标识
    this.modulesCorner[row + r][col + c] = 'isPosition'
    
  • 同样在setupPositionAdjustPattern函数中内层循环中进行标识
  • 此处要注意因为校正图形只需要标识右下角那一个
    this.modulesCorner[pos[pos.length - 1] + r][pos[pos.length - 1] + c] = 'isPosition'
    
  • 最后只需要在e.prototype.draw中判断是否为豁免码点isPosition
  • 若为企微模式,则把码点间距拉长1.5倍即可
    _oContext.fillRect(
      nLeft,
      nTop,
      isPosition ? nWidth : nWidth / 1.5,
      isPosition ? nHeight : nHeight / 1.5
    )
    

你可能感兴趣的:(qrcode源码修改,输出企业微信二维码)