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 相关文章推荐
JavaScript 格式字符串的应用
Mar 29 Javascript
JQuery autocomplete 使用手册
Apr 01 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
Apr 01 Javascript
JavaScript 的继承
Oct 01 Javascript
js实现按一下删除键删除整个单词附demo
Sep 05 Javascript
多个checkbox被选中时如何判断是否有自己想要的
Sep 22 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
莱鸟介绍window.print()方法
Jan 06 Javascript
jquery.qtip提示信息插件用法简单实例
Jun 17 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 Javascript
浅谈JS封闭函数、闭包、内置对象
Jul 18 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
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
详解JavaScript的变量
2019/04/04 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
简单实现python爬虫功能
2015/12/31 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
python将视频转换为全字符视频
2019/04/26 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
python实现文字版扫雷
2020/04/24 Python
python Tornado框架的使用示例
2020/10/19 Python
大学生个人事迹材料
2014/01/21 职场文书
高级编程求职信模板
2014/02/16 职场文书
优秀员工推荐信
2014/05/10 职场文书
毕业酒会致辞
2015/07/29 职场文书
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS
Redis RDB技术底层原理详解
2021/09/04 Redis
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫
Java死锁的排查
2022/05/11 Java/Android