javaScript生成支持中文带logo的二维码(jquery.qrcode.js)


Posted in Javascript onJanuary 03, 2017

本文实例为大家分享了支持中文,且带logo的二维码的生成代码,供大家参考,具体内容如下

资料搜索

javaScript生成支持中文带logo的二维码(jquery.qrcode.js)

选择star最多的两个

javaScript生成支持中文带logo的二维码(jquery.qrcode.js)

第一个就是用的比较多的jquery.qrcode.js(但不支持中文,不能带logo)啦,第二个支持ie6+,支持中文,根据第二个源代码,使得,jquery.qrcode.js,支持中文。

支持中文

//qrcode.js
function QR8bitByte(data) {
  this.mode = QRMode.MODE_8BIT_BYTE;
  this.data = data;
}

QR8bitByte.prototype = {

  getLength : function(buffer) {
    return this.data.length;
  },

  write : function(buffer) {
    for (var i = 0; i < this.data.length; i++) {
      // not JIS ...
      buffer.put(this.data.charCodeAt(i), 8);
    }
  }
};

修改如下(就是复制粘贴了第二份代码的头部):

function QR8bitByte(data) {
  this.mode = QRMode.MODE_8BIT_BYTE;
  this.data = data;
  this.parsedData = [];

  // Added to support UTF-8 Characters
  for (var i = 0, l = this.data.length; i < l; i++) {
    var byteArray = [];
    var code = this.data.charCodeAt(i);

    if (code > 0x10000) {
      byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
      byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
      byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
      byteArray[3] = 0x80 | (code & 0x3F);
    } else if (code > 0x800) {
      byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
      byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
      byteArray[2] = 0x80 | (code & 0x3F);
    } else if (code > 0x80) {
      byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
      byteArray[1] = 0x80 | (code & 0x3F);
    } else {
      byteArray[0] = code;
    }

    this.parsedData.push(byteArray);
  }

  this.parsedData = Array.prototype.concat.apply([], this.parsedData);

  if (this.parsedData.length != this.data.length) {
    this.parsedData.unshift(191);
    this.parsedData.unshift(187);
    this.parsedData.unshift(239);
  }
}

QR8bitByte.prototype = {
  getLength: function (buffer) {
    return this.parsedData.length;
  },
  write: function (buffer) {
    for (var i = 0, l = this.parsedData.length; i < l; i++) {
      buffer.put(this.parsedData[i], 8);
    }
  }
};

 网上也提供的解决方案:

//在传入文本处转码也可
function utf16to8(str) {
  var out, i, len, c;
  out = "";
  len = str.length;
  for(i = 0; i < len; i++) {
    c = str.charCodeAt(i);
    if ((c >= 0x0001) && (c <= 0x007F)) {
      out += str.charAt(i);
    } else if (c > 0x07FF) {
      out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
      out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
      out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
    } else {
      out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
      out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
    }
  }
  return out;
}

支持自定义logo

修改jquery.qrcode.js,createCanvas函数

var createCanvas  = function(){
      // create the qrcode itself
      var qrcode = new QRCode(options.typeNumber, options.correctLevel);
      qrcode.addData(options.text);
      qrcode.make();

      // create canvas element
      var canvas = document.createElement('canvas');
      canvas.width  = options.width;
      canvas.height  = options.height;
      var ctx   = canvas.getContext('2d');

      //增加以下代码,把图片画出来
      if( options.src ) {//传进来的图片地址
        //图片大小
        options.imgWidth = options.imgWidth || options.width / 4.7;
        options.imgHeight = options.imgHeight || options.height / 4.7;
        var img = new Image();
        img.src = options.src;
        //不放在onload里,图片出不来
        img.onload = function () {
          ctx.drawImage(img, (options.width - options.imgWidth) / 2, (options.height - options.imgHeight) / 2, options.imgWidth, options.imgHeight);
        }
      }
      // compute tileW/tileH based on options.width/options.height
      var tileW  = options.width / qrcode.getModuleCount();
      var tileH  = options.height / qrcode.getModuleCount();

      // draw in the canvas
      for( var row = 0; row < qrcode.getModuleCount(); row++ ){
        for( var col = 0; col < qrcode.getModuleCount(); col++ ){
          ctx.fillStyle = qrcode.isDark(row, col) ? options.foreground : options.background;
          var w = (Math.ceil((col+1)*tileW) - Math.floor(col*tileW));
          var h = (Math.ceil((row+1)*tileW) - Math.floor(row*tileW));
          ctx.fillRect(Math.round(col*tileW),Math.round(row*tileH), w, h); 
        }  
      }
      // return just built canvas
      return canvas;
    };

修改jquery.qrcode.js,createTable函数(不支持canvas用table画二维码)

var createTable = function(){
      // create the qrcode itself
      var qrcode = new QRCode(options.typeNumber, options.correctLevel);
      qrcode.addData(options.text);
      qrcode.make();

      // create table element
      var $table  = $('<table></table>')
        .css("width", options.width+"px")
        .css("height", options.height+"px")
        .css("border", "0px")
        .css("border-collapse", "collapse")
        .css('background-color', options.background);

      // compute tileS percentage
      var tileW  = options.width / qrcode.getModuleCount();
      var tileH  = options.height / qrcode.getModuleCount();

      // draw in the table
      for(var row = 0; row < qrcode.getModuleCount(); row++ ){
        var $row = $('<tr></tr>').css('height', tileH+"px").appendTo($table);

        for(var col = 0; col < qrcode.getModuleCount(); col++ ){
          $('<td></td>')
            .css('width', tileW+"px")
            .css('background-color', qrcode.isDark(row, col) ? options.foreground : options.background)
            .appendTo($row);
        }  
      }

      //主要思想,把table,和img标签放在同一个div下,div relative定位,然后使得图片absolute定位在table中间
      if( options.src ) {
        options.imgWidth = options.imgWidth || options.width / 4.7;
        options.imgHeight = options.imgHeight || options.height / 4.7;
        var $img = $('<img>').attr("src", options.src)
          .css("width", options.imgWidth)
          .css("height", options.imgHeight)
          .css("position", "absolute")
          .css("left", (options.width - options.imgWidth) / 2)
          .css("top", (options.height - options.imgHeight) / 2);
        $table = $('<div style="position:relative;"></div>')
          .append($table)
          .append($img);
      }

      // return just built canvas
      return $table;
    };

对IE做特殊判断,大家懂的

//判断是否IE, IE8以下,用 table,否则用 canvas
    var isIE = function() {
      var b = document.createElement('b');
      b.innerHTML = '<!--[if IE]><i></i><![endif]-->';
      return b.getElementsByTagName('i').length === 1;
    };
    options.render = options.render ||
      (isIE(6) || isIE(7) || isIE(8))? "table": "canvas";

改过后的jquery.qrcode.js如下:

(function( $ ){
  $.fn.qrcode = function(options) {
    // if options is string, 
    if( typeof options === 'string' ){
      options = { text: options };
    }

    //判断是否IE, IE8以下,用 table,否则用 canvas
    var isIE = function() {
      var b = document.createElement('b');
      b.innerHTML = '<!--[if IE]><i></i><![endif]-->';
      return b.getElementsByTagName('i').length === 1;
    };
    options.render = options.render ||
      (isIE(6) || isIE(7) || isIE(8))? "table": "canvas";
    // set default values
    // typeNumber < 1 for automatic calculation
    options = $.extend( {}, {
      // render    : "canvas",
      width    : 256,
      height   : 256,
      typeNumber : -1,
      correctLevel  : QRErrorCorrectLevel.H,
            background   : "#ffffff",
            foreground   : "#000000"
    }, options);

    var createCanvas  = function(){
      // create the qrcode itself
      var qrcode = new QRCode(options.typeNumber, options.correctLevel);
      qrcode.addData(options.text);
      qrcode.make();

      // create canvas element
      var canvas = document.createElement('canvas');
      canvas.width  = options.width;
      canvas.height  = options.height;
      var ctx   = canvas.getContext('2d');

      //在中间画logo
      if( options.src ) {
        options.imgWidth = options.imgWidth || options.width / 4.7;
        options.imgHeight = options.imgHeight || options.height / 4.7;
        var img = new Image();
        img.src = options.src;
        img.onload = function () {
          ctx.drawImage(img, (options.width - options.imgWidth) / 2, (options.height - options.imgHeight) / 2, options.imgWidth, options.imgHeight);
        }
      }
      // compute tileW/tileH based on options.width/options.height
      var tileW  = options.width / qrcode.getModuleCount();
      var tileH  = options.height / qrcode.getModuleCount();

      // draw in the canvas
      for( var row = 0; row < qrcode.getModuleCount(); row++ ){
        for( var col = 0; col < qrcode.getModuleCount(); col++ ){
          ctx.fillStyle = qrcode.isDark(row, col) ? options.foreground : options.background;
          var w = (Math.ceil((col+1)*tileW) - Math.floor(col*tileW));
          var h = (Math.ceil((row+1)*tileW) - Math.floor(row*tileW));
          ctx.fillRect(Math.round(col*tileW),Math.round(row*tileH), w, h); 
        }  
      }
      // return just built canvas
      return canvas;
    };

    // from Jon-Carlos Rivera (https://github.com/imbcmdth)
    var createTable = function(){
      // create the qrcode itself
      var qrcode = new QRCode(options.typeNumber, options.correctLevel);
      qrcode.addData(options.text);
      qrcode.make();

      // create table element
      var $table  = $('<table></table>')
        .css("width", options.width+"px")
        .css("height", options.height+"px")
        .css("border", "0px")
        .css("border-collapse", "collapse")
        .css('background-color', options.background);

      // compute tileS percentage
      var tileW  = options.width / qrcode.getModuleCount();
      var tileH  = options.height / qrcode.getModuleCount();

      // draw in the table
      for(var row = 0; row < qrcode.getModuleCount(); row++ ){
        var $row = $('<tr></tr>').css('height', tileH+"px").appendTo($table);

        for(var col = 0; col < qrcode.getModuleCount(); col++ ){
          $('<td></td>')
            .css('width', tileW+"px")
            .css('background-color', qrcode.isDark(row, col) ? options.foreground : options.background)
            .appendTo($row);
        }  
      }

      //生成logo
      if( options.src ) {
        options.imgWidth = options.imgWidth || options.width / 4.7;
        options.imgHeight = options.imgHeight || options.height / 4.7;
        var $img = $('<img>').attr("src", options.src)
          .css("width", options.imgWidth)
          .css("height", options.imgHeight)
          .css("position", "absolute")
          .css("left", (options.width - options.imgWidth) / 2)
          .css("top", (options.height - options.imgHeight) / 2);
        $table = $('<div style="position:relative;"></div>')
          .append($table)
          .append($img);
      }

      // return just built canvas
      return $table;
    };


    return this.each(function(){
      var element = options.render == "canvas" ? createCanvas() : createTable();
      $(element).appendTo(this);
    });
  };
})( jQuery );

测试

jQuery('#qrcodeTable').qrcode({
  render : "table",
  text  : "中文://jetienne.com",
  src: './logo32.png'
});
jQuery('#qrcodeCanvas').qrcode({
  text  : "中午你://jetienne.com",
  src: './logo32.png'
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery $.ajax入门应用一
Nov 19 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
Jul 24 Javascript
THREE.JS入门教程(5)你应当知道的十件事
Jan 24 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
Jun 13 Javascript
jquery查找父元素、子元素(个人经验总结)
Apr 09 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
May 20 Javascript
全面解析bootstrap格子布局
May 22 Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 Javascript
基于vuejs+webpack的日期选择插件
May 21 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
Nov 07 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
Sep 07 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
Oct 26 Javascript
非常优秀的JS图片轮播插件Swiper的用法
Jan 03 #Javascript
JavaScript对象封装的简单实现方法(3种方法)
Jan 03 #Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
Jan 03 #Javascript
vue.js将unix时间戳转换为自定义时间格式
Jan 03 #Javascript
使用Angular缓存父页面数据的方法
Jan 03 #Javascript
JS实现简单的二元方程计算器功能示例
Jan 03 #Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
Jan 03 #Javascript
You might like
通过对服务器端特性的配置加强php的安全
2006/10/09 PHP
PHP脚本的10个技巧(2)
2006/10/09 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
php购物车实现方法
2015/01/03 PHP
ThinkPHP安装和设置
2015/07/27 PHP
自制PHP框架之设计模式
2017/05/07 PHP
js实现杯子倒水问题自动求解程序
2013/03/25 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
layui实现三级导航菜单
2019/07/26 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
Python正则表达式使用经典实例
2016/06/21 Python
pyenv命令管理多个Python版本
2017/03/26 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python 加密的实例详解
2017/10/09 Python
python实现两个文件合并功能
2018/04/01 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
python 自动去除空行的实例
2018/07/24 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
Python extract及contains方法代码实例
2020/09/11 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
领导党性分析材料
2014/02/15 职场文书
晚会主持词开场白
2014/03/17 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
委托书的格式
2014/08/01 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
反邪教教育心得体会
2016/01/15 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
Python利用folium实现地图可视化
2021/05/23 Python