一、简介

使用js实现二维码生成

二、使用步骤

1.引入文件qrcode.js

<script src="js/qrcode.js"></script>

2.html代码结构:

<div id="qrcode"></div>

3.默认二维码生成(js)

<script>new QRCode(document.getElementById("qrcode"), "https://baidu.com");
</script>

缺点就是默认黑色。

如果想调整颜色和大小可以设置二维码的一些其他基本参数:

var qrcode = new QRCode(document.getElementById("qrcode"), {text: "https://www.bilibili.com/", //扫描二维码后的内容width: 128, //二维码的宽height: 128, //二维码的高colorDark: "green", //二维码线条颜色colorLight: "#ffffff", //二维码背景颜色correctLevel: QRCode.CorrectLevel.H //二维码等级
});

三、案例完整代码

1.代码:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><script src="js/qrcode.js"></script><style>#qrcode {width: 100px;height: 100px;}#qrcode img {width: 100%;}</style></head><body><div id="qrcode"></div><script>/* 生成二维码 */var qrcode = new QRCode(document.getElementById("qrcode"), {text: "https://www.bilibili.com/", //扫描二维码后的内容width: 128, //二维码的宽height: 128, //二维码的高colorDark: "green", //二维码线条颜色colorLight: "#ffffff", //二维码背景颜色correctLevel: QRCode.CorrectLevel.H //二维码等级});</script></body>
</html>

2.qrcode.js文件:

/*** @fileoverview* - Using the 'QRCode for Javascript library'* - Fixed dataset of 'QRCode for Javascript library' for support full-spec.* - this library has no dependencies.* * @author davidshimjs* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>*/
var QRCode;(function () {//---------------------------------------------------------------------// QRCode for JavaScript//// Copyright (c) 2009 Kazuhiko Arase//// URL: http://www.d-project.com///// Licensed under the MIT license://   http://www.opensource.org/licenses/mit-license.php//// The word "QR Code" is registered trademark of // DENSO WAVE INCORPORATED//   http://www.denso-wave.com/qrcode/faqpatent-e.html////---------------------------------------------------------------------function QR8bitByte(data) {this.mode = QRMode.MODE_8BIT_BYTE;this.data = data;this.parsedData = [];// Added to support UTF-8 Charactersfor (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 QRCodeModel(typeNumber, errorCorrectLevel) {this.typeNumber = typeNumber;this.errorCorrectLevel = errorCorrectLevel;this.modules = null;this.moduleCount = 0;this.dataCache = null;this.dataList = [];}QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);}return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}this.modules[r][6]=(r%2==0);}for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. ("+buffer.getLengthInBits()+">"+totalDataCount*8+")");}if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}buffer.put(QRCodeModel.PAD1,8);}return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}if(r==0&&c==0){continue;}if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}if(sameCount>5){lostPoint+=(3+sameCount-5);}}}for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");}return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}while(n>=256){n-=255;}return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);}var offset=0;while(offset<num.length&&num[offset]==0){offset++;}this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);}var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];function _isSupportCanvas() {return typeof CanvasRenderingContext2D != "undefined";}// android 2.x doesn't support Data-URI specfunction _getAndroid() {var android = false;var sAgent = navigator.userAgent;if (/android/i.test(sAgent)) { // androidandroid = true;var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);if (aMat && aMat[1]) {android = parseFloat(aMat[1]);}}return android;}var svgDrawer = (function() {var Drawing = function (el, htOption) {this._el = el;this._htOption = htOption;};Drawing.prototype.draw = function (oQRCode) {var _htOption = this._htOption;var _el = this._el;var nCount = oQRCode.getModuleCount();var nWidth = Math.floor(_htOption.width / nCount);var nHeight = Math.floor(_htOption.height / nCount);this.clear();function makeSVG(tag, attrs) {var el = document.createElementNS('http://www.w3.org/2000/svg', tag);for (var k in attrs)if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);return el;}var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");_el.appendChild(svg);svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"}));svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));for (var row = 0; row < nCount; row++) {for (var col = 0; col < nCount; col++) {if (oQRCode.isDark(row, col)) {var child = makeSVG("use", {"x": String(col), "y": String(row)});child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template")svg.appendChild(child);}}}};Drawing.prototype.clear = function () {while (this._el.hasChildNodes())this._el.removeChild(this._el.lastChild);};return Drawing;})();var useSVG = document.documentElement.tagName.toLowerCase() === "svg";// Drawing in DOM by using Table tagvar Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {var Drawing = function (el, htOption) {this._el = el;this._htOption = htOption;};/*** Draw the QRCode* * @param {QRCode} oQRCode*/Drawing.prototype.draw = function (oQRCode) {var _htOption = this._htOption;var _el = this._el;var nCount = oQRCode.getModuleCount();var nWidth = Math.floor(_htOption.width / nCount);var nHeight = Math.floor(_htOption.height / nCount);var aHTML = ['<table style="border:0;border-collapse:collapse;">'];for (var row = 0; row < nCount; row++) {aHTML.push('<tr>');for (var col = 0; col < nCount; col++) {aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>');}aHTML.push('</tr>');}aHTML.push('</table>');_el.innerHTML = aHTML.join('');// Fix the margin values as real size.var elTable = _el.childNodes[0];var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;if (nLeftMarginTable > 0 && nTopMarginTable > 0) {elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";    }};/*** Clear the QRCode*/Drawing.prototype.clear = function () {this._el.innerHTML = '';};return Drawing;})() : (function () { // Drawing in Canvasfunction _onMakeImage() {this._elImage.src = this._elCanvas.toDataURL("image/png");this._elImage.style.display = "block";this._elCanvas.style.display = "none";            }// Android 2.1 bug workaround// http://code.google.com/p/android/issues/detail?id=5141if (this._android && this._android <= 2.1) {var factor = 1 / window.devicePixelRatio;var drawImage = CanvasRenderingContext2D.prototype.drawImage; CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {if (("nodeName" in image) && /img/i.test(image.nodeName)) {for (var i = arguments.length - 1; i >= 1; i--) {arguments[i] = arguments[i] * factor;}} else if (typeof dw == "undefined") {arguments[1] *= factor;arguments[2] *= factor;arguments[3] *= factor;arguments[4] *= factor;}drawImage.apply(this, arguments); };}/*** Check whether the user's browser supports Data URI or not* * @private* @param {Function} fSuccess Occurs if it supports Data URI* @param {Function} fFail Occurs if it doesn't support Data URI*/function _safeSetDataURI(fSuccess, fFail) {var self = this;self._fFail = fFail;self._fSuccess = fSuccess;// Check it just onceif (self._bSupportDataURI === null) {var el = document.createElement("img");var fOnError = function() {self._bSupportDataURI = false;if (self._fFail) {self._fFail.call(self);}};var fOnSuccess = function() {self._bSupportDataURI = true;if (self._fSuccess) {self._fSuccess.call(self);}};el.onabort = fOnError;el.onerror = fOnError;el.onload = fOnSuccess;el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.return;} else if (self._bSupportDataURI === true && self._fSuccess) {self._fSuccess.call(self);} else if (self._bSupportDataURI === false && self._fFail) {self._fFail.call(self);}};/*** Drawing QRCode by using canvas* * @constructor* @param {HTMLElement} el* @param {Object} htOption QRCode Options */var Drawing = function (el, htOption) {this._bIsPainted = false;this._android = _getAndroid();this._htOption = htOption;this._elCanvas = document.createElement("canvas");this._elCanvas.width = htOption.width;this._elCanvas.height = htOption.height;el.appendChild(this._elCanvas);this._el = el;this._oContext = this._elCanvas.getContext("2d");this._bIsPainted = false;this._elImage = document.createElement("img");this._elImage.alt = "Scan me!";this._elImage.style.display = "none";this._el.appendChild(this._elImage);this._bSupportDataURI = null;};/*** Draw the QRCode* * @param {QRCode} oQRCode */Drawing.prototype.draw = function (oQRCode) {var _elImage = this._elImage;var _oContext = this._oContext;var _htOption = this._htOption;var nCount = oQRCode.getModuleCount();var nWidth = _htOption.width / nCount;var nHeight = _htOption.height / nCount;var nRoundedWidth = Math.round(nWidth);var nRoundedHeight = Math.round(nHeight);_elImage.style.display = "none";this.clear();for (var row = 0; row < nCount; row++) {for (var col = 0; col < nCount; col++) {var bIsDark = oQRCode.isDark(row, col);var nLeft = col * nWidth;var nTop = row * nHeight;_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;_oContext.lineWidth = 1;_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;                  _oContext.fillRect(nLeft, nTop, nWidth, nHeight);// 안티 앨리어싱 방지 처리_oContext.strokeRect(Math.floor(nLeft) + 0.5,Math.floor(nTop) + 0.5,nRoundedWidth,nRoundedHeight);_oContext.strokeRect(Math.ceil(nLeft) - 0.5,Math.ceil(nTop) - 0.5,nRoundedWidth,nRoundedHeight);}}this._bIsPainted = true;};/*** Make the image from Canvas if the browser supports Data URI.*/Drawing.prototype.makeImage = function () {if (this._bIsPainted) {_safeSetDataURI.call(this, _onMakeImage);}};/*** Return whether the QRCode is painted or not* * @return {Boolean}*/Drawing.prototype.isPainted = function () {return this._bIsPainted;};/*** Clear the QRCode*/Drawing.prototype.clear = function () {this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);this._bIsPainted = false;};/*** @private* @param {Number} nNumber*/Drawing.prototype.round = function (nNumber) {if (!nNumber) {return nNumber;}return Math.floor(nNumber * 1000) / 1000;};return Drawing;})();/*** Get the type by string length* * @private* @param {String} sText* @param {Number} nCorrectLevel* @return {Number} type*/function _getTypeNumber(sText, nCorrectLevel) {            var nType = 1;var length = _getUTF8Length(sText);for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {var nLimit = 0;switch (nCorrectLevel) {case QRErrorCorrectLevel.L :nLimit = QRCodeLimitLength[i][0];break;case QRErrorCorrectLevel.M :nLimit = QRCodeLimitLength[i][1];break;case QRErrorCorrectLevel.Q :nLimit = QRCodeLimitLength[i][2];break;case QRErrorCorrectLevel.H :nLimit = QRCodeLimitLength[i][3];break;}if (length <= nLimit) {break;} else {nType++;}}if (nType > QRCodeLimitLength.length) {throw new Error("Too long data");}return nType;}function _getUTF8Length(sText) {var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');return replacedText.length + (replacedText.length != sText ? 3 : 0);}/*** @class QRCode* @constructor* @example * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");** @example* var oQRCode = new QRCode("test", {*    text : "http://naver.com",*    width : 128,*    height : 128* });* * oQRCode.clear(); // Clear the QRCode.* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.** @param {HTMLElement|String} el target element or 'id' attribute of element.* @param {Object|String} vOption* @param {String} vOption.text QRCode link data* @param {Number} [vOption.width=256]* @param {Number} [vOption.height=256]* @param {String} [vOption.colorDark="#000000"]* @param {String} [vOption.colorLight="#ffffff"]* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] */QRCode = function (el, vOption) {this._htOption = {width : 256, height : 256,typeNumber : 4,colorDark : "#000000",colorLight : "#ffffff",correctLevel : QRErrorCorrectLevel.H};if (typeof vOption === 'string') {vOption    = {text : vOption};}// Overwrites optionsif (vOption) {for (var i in vOption) {this._htOption[i] = vOption[i];}}if (typeof el == "string") {el = document.getElementById(el);}if (this._htOption.useSVG) {Drawing = svgDrawer;}this._android = _getAndroid();this._el = el;this._oQRCode = null;this._oDrawing = new Drawing(this._el, this._htOption);if (this._htOption.text) {this.makeCode(this._htOption.text);    }};/*** Make the QRCode* * @param {String} sText link data*/QRCode.prototype.makeCode = function (sText) {this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);this._oQRCode.addData(sText);this._oQRCode.make();this._el.title = sText;this._oDrawing.draw(this._oQRCode);         this.makeImage();};/*** Make the Image from Canvas element* - It occurs automatically* - Android below 3 doesn't support Data-URI spec.* * @private*/QRCode.prototype.makeImage = function () {if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {this._oDrawing.makeImage();}};/*** Clear the QRCode*/QRCode.prototype.clear = function () {this._oDrawing.clear();};/*** @name QRCode.CorrectLevel*/QRCode.CorrectLevel = QRErrorCorrectLevel;
})();

二维码生成(js实现)相关推荐

  1. qrcodejs2二维码生成js

    <div class="qrcode" ref="qrCodeUrl"></div> <div class="rxpir ...

  2. js 生成二维码_QRcode.js 生成二维码

    github官方文档指路:https://github.com/soldair/node-qrcode#options QRcode方法介绍: 这里只介绍后三种常用方法的使用: 1.toCanvas ...

  3. JS的条形码和二维码生成

    一.前言 最近做项目用到了JS生成条形码和二维码,内容不多,整理一下方便使用. 2018年7月5日更新: 二维码生成时,如果长度太长会有异常: Uncaught Error: code length ...

  4. 介绍两个用于生成二维码的js库

    生成二维码的js库 QRCode.js 简介 使用示例 jquery.qrcode.js 简介 使用示例 调整二维码尺寸 QRCode.js 简介 这是一个原生的js库,用于生成二维码. github ...

  5. 二维码生成插件qrious(纯JS)

    二维码生成插件qrious(纯JS) 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能 ...

  6. jquery二维码生成插件jquery.qrcode.js在线生成二维码

    一代巨匠金庸先生驾鹤西去,谢谢您的作品,陪我度过儿时的时光 –2018.10.31 一.场景再现 由于业务需求,经常会将访问链接分享给别人,方便其他客户访问我们的业务.在本周的需求中,我们需要根据地址 ...

  7. js 实现二维码生成

    我们可以使用qrcodejs来实现js生成二维码,qrcodejs是用于JavaScript的跨浏览器QRCode生成器,可以十分简单的实现二维码生成 一:下载qrcodejs插件 qrcode的地址 ...

  8. JS二维码生成插件,一键生成二维码

    jquery.qrcode是个依赖jquery的二维码生成插件,主要用于连接和文本的二维码生成,有两种生成格式canvas和table格式的,当然canvas不支持低版本浏览器,table有点小bug ...

  9. 转【微信小程序 四】二维码生成/扫描二维码

    原文:https://blog.csdn.net/xbw12138/article/details/75213274 前端  二维码生成  二维码要求:每分钟刷新一次,模拟了个鸡肋,添加了个按分钟显示 ...

  10. canvas 插件_基于canvas的JavaScript 二维码生成工具——QRCanvas

    介绍 在我们日常的开发中,特别是在现代的社会环境下,二维码的应用可谓是丰富多彩,各种各样让人眼花缭乱的二维码,可见二维码已经渗透进我们生活的方方面面,也可以说目二维码确确实实方便了我们的生活.因为作为 ...

最新文章

  1. oracle数据库学习相关笔记-转换函数
  2. Win10安装Ubuntu系统
  3. opencv的基本数据结构(一)(转)
  4. SAP Spartacus Category Navigation的accessibility问题
  5. 第三章 对象与JSON
  6. Android 加入一个动作按钮
  7. 北京公交“十三五”将通过大数据实现线路优化
  8. Win10 Build9926 更新问题解决
  9. 311、FirebaseAnalytics和Google Analytics总结
  10. ZZULIOJ1011: 圆柱体表面积
  11. Python聚类分析
  12. 设置允许远程连接数据库
  13. ubuntu安装mysql忘记密码并重置
  14. 某数4代cookie生成-2
  15. 基于ESP8266和51单片机的手机遥控小车
  16. springboot毕设项目大学生租房系统s9331(java+VUE+Mybatis+Maven+Mysql)
  17. HTML 正则表达式 输入框数字+字母、数字 四位数
  18. 如何预防猪流感!猪流感!?会像SARS那样爆发吗?我们能作的就是预防。
  19. [2021年秋招笔试记录]OPPO_8.29_机器学习算法A卷
  20. 支持将树莓派转换成NAS存储系统

热门文章

  1. 微机原理课程设计-接口芯片编程记录
  2. STM32 避障小车 —— HC-SR04
  3. photoshop插件开发
  4. linux 交叉编译器作用,Linux下交叉编译器学习
  5. Matlab之聚类分析
  6. 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)
  7. eclipse svn忽略指定文件或文件夹
  8. hibernate历史版本下载
  9. 最强半自动化抓鸡工具打造思路
  10. Structs框架原理