let QRCode={}; (function(){ function unicodeFormat8(code){ var c0,c1,c2; if(code<128){ return[code]; }else if(code<2048){ c0=192+(code>>6); c1=128+(code&63); return[c0,c1]; }else{ c0=224+(code>>12); c1=128+(code>>6&63); c2=128+(code&63); return[c0,c1,c2]; } } function getUTF8Bytes(string){ var utf8codes=[]; for(var i=0;i<string.length;i++){ var code=string.charCodeAt(i); var utf8=unicodeFormat8(code); for(var j=0;j<utf8.length;j++){ utf8codes.push(utf8[j]); } } return utf8codes; } function QRCodeAlg(data,twodimensionalcodeee5conversionmethod){ this.typeNumber=-1; this.errorCorrectLevel=twodimensionalcodeee5conversionmethod; this.modules=null; this.moduleCount=0; this.dataCache=null; this.rsBlocks=null; this.totalDataCount=-1; this.data=data; this.utf8bytes=getUTF8Bytes(data); this.make(); } QRCodeAlg.prototype={ constructor:QRCodeAlg, getModuleCount:function(){ return this.moduleCount; }, make:function(){ this.getRightType(); this.dataCache=this.createData(); this.createQrcode(); }, makeImpl:function(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); } this.setupPositionProbePattern(0,0); this.setupPositionProbePattern(this.moduleCount-7,0); this.setupPositionProbePattern(0,this.moduleCount-7); this.setupPositionAdjustPattern(); this.setupTimingPattern(); this.setupTypeInfo(true,maskPattern); if(this.typeNumber>=7){ this.setupTypeNumber(true); } 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; } } } }, createQrcode:function(){ var minLostPoint=0; var pattern=0; var bestModules=null; for(var i=0;i<8;i++){ this.makeImpl(i); var lostPoint=QRUtil.getLostPoint(this); if(i==0||minLostPoint>lostPoint){ minLostPoint=lostPoint; pattern=i; bestModules=this.modules; } } this.modules=bestModules; this.setupTypeInfo(false,pattern); if(this.typeNumber>=7){ this.setupTypeNumber(false); } }, 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); if(this.modules[6][r]!=null){ continue; } this.modules[6][r]=(r%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; this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod; } }, setupTypeInfo:function(test,maskPattern){ var data=(QRErrorCorrectLevel[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; } 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); }, createData:function(){ var buffer=new QRBitBuffer(); var lengthBits=this.typeNumber>9?16:8; buffer.put(4,4); buffer.put(this.utf8bytes.length,lengthBits); for(var i=0,l=this.utf8bytes.length;i<l;i++){ buffer.put(this.utf8bytes[i],8); } if(buffer.length+4<=this.totalDataCount*8){ buffer.put(0,4); } while(buffer.length%8!=0){ buffer.putBit(false); } while(true){ if(buffer.length>=this.totalDataCount*8){ break; } buffer.put(QRCodeAlg.PAD0,8); if(buffer.length>=this.totalDataCount*8){ break; } buffer.put(QRCodeAlg.PAD1,8); } return this.createBytes(buffer); }, createBytes:function(buffer){ var offset=0; var maxDcCount=0; var maxEcCount=0; var length=this.rsBlock.length/3; var rsBlocks=new Array(); for(var i=0;i<length;i++){ var count=this.rsBlock[i*3+0]; var totalCount=this.rsBlock[i*3+1]; var dataCount=this.rsBlock[i*3+2]; for(var j=0;j<count;j++){ rsBlocks.push([dataCount,totalCount]); } } var dcdata=new Array(rsBlocks.length); var ecdata=new Array(rsBlocks.length); for(var r=0;r<rsBlocks.length;r++){ var dcCount=rsBlocks[r][0]; var ecCount=rsBlocks[r][1]-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 data=new Array(this.totalDataCount); 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; }, 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; } } } } }; QRCodeAlg.PAD0=0xEC; QRCodeAlg.PAD1=0x11; var QRErrorCorrectLevel=[1,0,3,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; }, getLostPoint:function(qrCode){ var moduleCount=qrCode.getModuleCount(), lostPoint=0, darkCount=0; for(var row=0;row<moduleCount;row++){ var sameCount=0; var head=qrCode.modules[row][0]; for(var col=0;col<moduleCount;col++){ var current=qrCode.modules[row][col]; if(col<moduleCount-6){ if(current&&!qrCode.modules[row][col+1]&&qrCode.modules[row][col+2]&&qrCode.modules[row][col+3]&&qrCode.modules[row][col+4]&&!qrCode.modules[row][col+5]&&qrCode.modules[row][col+6]){ if(col<moduleCount-10){ if(qrCode.modules[row][col+7]&&qrCode.modules[row][col+8]&&qrCode.modules[row][col+9]&&qrCode.modules[row][col+10]){ lostPoint+=40; } }else if(col>3){ if(qrCode.modules[row][col-1]&&qrCode.modules[row][col-2]&&qrCode.modules[row][col-3]&&qrCode.modules[row][col-4]){ lostPoint+=40; } } } } if((row<moduleCount-1)&&(col<moduleCount-1)){ var count=0; if(current)count++; if(qrCode.modules[row+1][col])count++; if(qrCode.modules[row][col+1])count++; if(qrCode.modules[row+1][col+1])count++; if(count==0||count==4){ lostPoint+=3; } } if(head^current){ sameCount++; }else{ head=current; if(sameCount>=5){ lostPoint+=(3+sameCount-5); } sameCount=1; } if(current){ darkCount++; } } } for(var col=0;col<moduleCount;col++){ var sameCount=0; var head=qrCode.modules[0][col]; for(var row=0;row<moduleCount;row++){ var current=qrCode.modules[row][col]; if(row<moduleCount-6){ if(current&&!qrCode.modules[row+1][col]&&qrCode.modules[row+2][col]&&qrCode.modules[row+3][col]&&qrCode.modules[row+4][col]&&!qrCode.modules[row+5][col]&&qrCode.modules[row+6][col]){ if(row<moduleCount-10){ if(qrCode.modules[row+7][col]&&qrCode.modules[row+8][col]&&qrCode.modules[row+9][col]&&qrCode.modules[row+10][col]){ lostPoint+=40; } }else if(row>3){ if(qrCode.modules[row-1][col]&&qrCode.modules[row-2][col]&&qrCode.modules[row-3][col]&&qrCode.modules[row-4][col]){ lostPoint+=40; } } } } if(head^current){ sameCount++; }else{ head=current; if(sameCount>=5){ lostPoint+=(3+sameCount-5); } sameCount=1; } } } 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){ var tl=this.getLength(), el=e.getLength(); if(tl-el<0){ return this; } var num=new Array(tl); for(var i=0;i<tl;i++){ num[i]=this.get(i); } while(num.length>=el){ var ratio=QRMath.glog(num[0])-QRMath.glog(e.get(0)); for(var i=0;i<e.getLength();i++){ num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio); } while(num[0]==0){ num.shift(); } } return new QRPolynomial(num,0); } }; var 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] ]; QRCodeAlg.prototype.getRightType=function(){ for(var typeNumber=1;typeNumber<41;typeNumber++){ var rsBlock=RS_BLOCK_TABLE[(typeNumber-1)*4+this.errorCorrectLevel]; if(rsBlock==undefined){ throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+this.errorCorrectLevel); } var length=rsBlock.length/3; var totalDataCount=0; for(var i=0;i<length;i++){ var count=rsBlock[i*3+0]; var dataCount=rsBlock[i*3+2]; totalDataCount+=dataCount*count; } var lengthBytes=typeNumber>9?2:1; if(this.utf8bytes.length+lengthBytes<totalDataCount||typeNumber==40){ this.typeNumber=typeNumber; this.rsBlock=rsBlock; this.totalDataCount=totalDataCount; break; } } }; function QRBitBuffer(){ this.buffer=new Array(); this.length=0; } QRBitBuffer.prototype={ get:function(index){ var bufIndex=Math.floor(index/8); return((this.buffer[bufIndex]>>>(7-index%8))&1); }, put:function(num,length){ for(var i=0;i<length;i++){ this.putBit(((num>>>(length-i-1))&1)); } }, 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++; } }; let qrcodeAlgObjCache=[]; QRCode=function(opt){ this.options={ text:'', size:256, correctLevel:3, background:'#ffffff', foreground:'#000000', pdground:'#000000', image:'', imageSize:30, canvasId:opt.canvasId, context:opt.context, usingComponents:opt.usingComponents, showLoading:opt.showLoading, loadingText:opt.loadingText, }; if(typeof opt==='string'){ opt={ text:opt }; } if(opt){ for(var i in opt){ this.options[i]=opt[i]; } } var qrCodeAlg=null; for(var i=0,l=qrcodeAlgObjCache.length;i<l;i++){ if(qrcodeAlgObjCache[i].text==this.options.text&&qrcodeAlgObjCache[i].text.correctLevel==this.options.correctLevel){ qrCodeAlg=qrcodeAlgObjCache[i].obj; break; } } if(i==l){ qrCodeAlg=new QRCodeAlg(this.options.text,this.options.correctLevel); qrcodeAlgObjCache.push({ text:this.options.text, correctLevel:this.options.correctLevel, obj:qrCodeAlg }); } let getForeGround=function(config){ var options=config.options; if(options.pdground&&( (config.row>1&&config.row<5&&config.col>1&&config.col<5)|| (config.row>(config.count-6)&&config.row<(config.count-2)&&config.col>1&&config.col<5)|| (config.row>1&&config.row<5&&config.col>(config.count-6)&&config.col<(config.count-2)) )){ return options.pdground; } return options.foreground; } let createCanvas=function(options){ if(options.showLoading){ uni.showLoading({ title:options.loadingText, mask:true }); } var ctx=uni.createCanvasContext(options.canvasId,options.context); var count=qrCodeAlg.getModuleCount(); var ratioSize=options.size; var ratioImgSize=options.imageSize; var tileW=(ratioSize/count).toPrecision(4); var tileH=(ratioSize/count).toPrecision(4); for(var row=0;row<count;row++){ for(var col=0;col<count;col++){ var w=(Math.ceil((col+1)*tileW)-Math.floor(col*tileW)); var h=(Math.ceil((row+1)*tileW)-Math.floor(row*tileW)); var foreground=getForeGround({ row:row, col:col, count:count, options:options }); ctx.setFillStyle(qrCodeAlg.modules[row][col]?foreground:options.background); ctx.fillRect(Math.round(col*tileW),Math.round(row*tileH),w,h); } } if(options.image){ var x=Number(((ratioSize-ratioImgSize)/2).toFixed(2)); var y=Number(((ratioSize-ratioImgSize)/2).toFixed(2)); drawRoundedRect(ctx,x,y,ratioImgSize,ratioImgSize,2,6,true,true) ctx.drawImage(options.image,x,y,ratioImgSize,ratioImgSize); function drawRoundedRect(ctxi,x,y,width,height,r,lineWidth,fill,stroke){ ctxi.setLineWidth(lineWidth); ctxi.setFillStyle(options.background); ctxi.setStrokeStyle(options.background); ctxi.beginPath(); ctxi.moveTo(x+r,y); ctxi.arcTo(x+width,y,x+width,y+r,r); ctxi.arcTo(x+width,y+height,x+width-r,y+height,r); ctxi.arcTo(x,y+height,x,y+height-r,r); ctxi.arcTo(x,y,x+r,y,r); ctxi.closePath(); if(fill){ ctxi.fill(); } if(stroke){ ctxi.stroke(); } } } setTimeout(()=>{ ctx.draw(true,()=>{ setTimeout(()=>{ uni.canvasToTempFilePath({ width:options.width, height:options.height, destWidth:options.width, destHeight:options.height, canvasId:options.canvasId, quality:Number(1), success:function(res){ if(options.cbResult){ options.cbResult(res.tempFilePath) } }, fail:function(res){ if(options.cbResult){ options.cbResult(res) } }, complete:function(){ if(options.showLoading){ uni.hideLoading(); } }, },options.context); },options.text.length+100); }); },options.usingComponents?0:150); } createCanvas(this.options); let empty=function(v){ let tp=typeof v, rt=false; if(tp=="number"&&String(v)==""){ rt=true }else if(tp=="undefined"){ rt=true }else if(tp=="object"){ if(JSON.stringify(v)=="{}"||JSON.stringify(v)=="[]"||v==null)rt=true }else if(tp=="string"){ if(v==""||v=="undefined"||v=="null"||v=="{}"||v=="[]")rt=true }else if(tp=="function"){ rt=false } return rt } }; QRCode.prototype.clear=function(fn){ var ctx=uni.createCanvasContext(this.options.canvasId,this.options.context) ctx.clearRect(0,0,this.options.size,this.options.size) ctx.draw(false,()=>{ if(fn){ fn() } }) }; })() export default QRCode