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

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

支持中文

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//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);
     }
   }
};

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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);
     }
   }
};

 网上也提供的解决方案:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//在传入文本处转码也可
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函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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画二维码)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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做特殊判断,大家懂的

?
1
2
3
4
5
6
7
8
//判断是否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如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
( 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 );

测试

?
1
2
3
4
5
6
7
8
9
jQuery( '#qrcodeTable' ).qrcode({
   render : "table" ,
   text  : "中文://jetienne.com" ,
   src: './logo32.png'
});
jQuery( '#qrcodeCanvas' ).qrcode({
   text  : "中午你://jetienne.com" ,
   src: './logo32.png'
});

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值