欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javaScript生成支持中文帶logo的二維碼(jquery.qrcode.js)

 更新時間:2021年10月28日 16:40:53   作者:God''''''''swill  
這篇文章主要介紹了javaScript生成二維碼,改造jquery.qrcode.js,使之支持中文,能帶logo的二維碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了支持中文,且?guī)ogo的二維碼的生成代碼,供大家參考,具體內(nèi)容如下

資料搜索

選擇star最多的兩個

第一個就是用的比較多的jquery.qrcode.js(但不支持中文,不能帶logo)啦,第二個支持ie6+,支持中文,根據(jù)第二個源代碼,使得,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);
    }
  }
};

修改如下(就是復(fù)制粘貼了第二份代碼的頭部):

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);
    }
  }
};

網(wǎng)上也提供的解決方案:

//在傳入文本處轉(zhuǎn)碼也可
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函數(shù)

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函數(shù)(不支持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標(biāo)簽放在同一個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'
});

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • js實現(xiàn)移動端圖片滑塊驗證功能

    js實現(xiàn)移動端圖片滑塊驗證功能

    這篇文章主要為大家詳細介紹了js實現(xiàn)移動端圖片滑塊驗證功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 微信小程序生成海報分享朋友圈的實現(xiàn)方法

    微信小程序生成海報分享朋友圈的實現(xiàn)方法

    利用微信強大的社交能力通過小程序達到裂變的目的,拉取新用戶。下面小編給大家?guī)砹宋⑿判〕绦蛏珊蠓窒砼笥讶Φ膶崿F(xiàn)方法,感興趣的朋友跟隨小編一起看看吧
    2019-05-05
  • 詳談LABJS按需動態(tài)加載js文件

    詳談LABJS按需動態(tài)加載js文件

    為了提高頁面的打開和加載速度,我們經(jīng)常把JS文件放在頁面的尾部,但是有些JS必須放在頁面前面,這樣就會增加頁面的加載時間;于是出現(xiàn)了按需動態(tài)加載的概念,這個概念就是當(dāng)頁面需要用到這個JS文件或者CSS渲染文件的時候,在去請求這些文件,這樣就節(jié)省了頁面的加載時間
    2015-05-05
  • 淺談Javascript嵌套函數(shù)及閉包

    淺談Javascript嵌套函數(shù)及閉包

    這篇文章其實是要講閉包的一些初級應(yīng)用,但是為了將閉包,我們還是從嵌套函數(shù)開始說吧,縱使所有的JavaScript函數(shù)都可以說是閉包,但是只有當(dāng)一個嵌套函數(shù)被導(dǎo)出到它所定義的作用域之外時,這種閉包才是有趣的。
    2010-11-11
  • 淺談Fetch 數(shù)據(jù)交互方式

    淺談Fetch 數(shù)據(jù)交互方式

    這篇文章主要介紹了淺談Fetch 數(shù)據(jù)交互方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • setTimeout函數(shù)兼容各主流瀏覽器運行執(zhí)行效果實例

    setTimeout函數(shù)兼容各主流瀏覽器運行執(zhí)行效果實例

    setTimeout是一個很不錯的函數(shù),網(wǎng)站頁面前端工程師經(jīng)常將其用于幾秒后執(zhí)行的動作,下文要講的setTimeout可以很好地兼容IE6,7,8,9以及谷歌等主流瀏覽器
    2013-06-06
  • 80行代碼寫一個Webpack插件并發(fā)布到npm

    80行代碼寫一個Webpack插件并發(fā)布到npm

    最近在學(xué)習(xí) Webpack 相關(guān)的原理,本文用80行代碼寫一個Webpack插件并發(fā)布到npm,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 如何利用微信小程序獲取OneNet平臺數(shù)據(jù)顯示溫濕度

    如何利用微信小程序獲取OneNet平臺數(shù)據(jù)顯示溫濕度

    最近在工作中遇到了一個需求,需要顯示溫濕度,網(wǎng)上找了一圈沒找到解決方法,所以只能自己寫一個,這篇文章主要給大家介紹了關(guān)于如何利用微信小程序獲取OneNet平臺數(shù)據(jù)顯示溫濕度的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 微信小程序復(fù)選框組件使用詳解

    微信小程序復(fù)選框組件使用詳解

    這篇文章主要為大家詳細介紹了微信小程序復(fù)選框組件使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • jquery根據(jù)錨點offset值實現(xiàn)動畫切換

    jquery根據(jù)錨點offset值實現(xiàn)動畫切換

    點擊后僵硬的切換是不是很不爽,下面為大家介紹的是根據(jù)錨點offset值來實現(xiàn)動畫切換,喜歡的朋友不要錯過
    2014-09-09

最新評論