微信小程序生成二维码并保存到本地方法
微信小程序生成二维码请保存到本地方法
官方weapp-qrcode插件 github链接
功能完成样子
wxml
<view class="qrcode"><canvas style="width: 275px; height: 275px;" canvas-id='myQrcode'></canvas>
</view>
<view class=" qrcode-btn" bind:tap="saveQrcode"><image src="https://imgzs.linkunst.com:10003/allimg/sccontrol/9999/20231128/21953source656544a5eb1de.png" mode="" /><view>保存图片</view>
</view>
js文件
import drawQrcode from './weapp-qrcode.js';
//二维码生成QRcodeGeneration() {return new Promise((resolve, reject) => {wx.hideLoading();drawQrcode({text: 'https://***/**?id=1', //您的生成路径width: 275, //宽度height: 275, //高度typeNumber: 7, //非必须,二维码的计算模式,默认值-1canvasId: 'myQrcode', //必须,绘制的canvasIdcorrectLevel: 1, //非必须,二维码纠错级别,默认值为高级,取值:{ L: 1, M: 0, Q: 3, H: 2 }_this: this, //非必须,若在组件中使用,需要传入,v0.7.0+版本支持callback: () => { //绘制完成回调 要加定时不然拿不到 暂不知道啥原因~setTimeout(() => { //更多配置请前往官方github地址文档查看wx.canvasToTempFilePath({canvasId: 'myQrcode',success: (res) => {resolve(res); //导出临时二维码图片路径},},this);}, 500);},});});},//保存二维码async saveQrcode() {const { tempFilePath } = await this.QRcodeGeneration(); //获取二维码路径wx.getImageInfo({src: tempFilePath,//传入success: function (ret) {var path = ret.path; wx.saveImageToPhotosAlbum({filePath: path,success(result) { //保存到本地if (result.errMsg === 'saveImageToPhotosAlbum:ok') {wx.showToast({title: '保存成功',});}},});},});},/*** 生命周期函数--监听页面加载*/onLoad(options) {wx.showLoading({ title: '正在努力生成~' });setTimeout(() => {this.QRcodeGeneration(); //这里加延迟因为怕拿不到canvas的dom}, 1000);},
如果github进不去可以直接复制我这个js到项目里
weapp-qrcode.js
/*** weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme)*/var hasOwn = Object.prototype.hasOwnProperty,toStr = Object.prototype.toString,defineProperty = Object.defineProperty,gOPD = Object.getOwnPropertyDescriptor,isArray = function (t) {return 'function' == typeof Array.isArray ? Array.isArray(t) : '[object Array]' === toStr.call(t);},isPlainObject = function (t) {if (!t || '[object Object]' !== toStr.call(t)) return !1;var e,r = hasOwn.call(t, 'constructor'),o = t.constructor && t.constructor.prototype && hasOwn.call(t.constructor.prototype, 'isPrototypeOf');if (t.constructor && !r && !o) return !1;for (e in t);return void 0 === e || hasOwn.call(t, e);},setProperty = function (t, e) {defineProperty && '__proto__' === e.name ? defineProperty(t, e.name, { enumerable: !0, configurable: !0, value: e.newValue, writable: !0 }) : (t[e.name] = e.newValue);},getProperty = function (t, e) {if ('__proto__' === e) {if (!hasOwn.call(t, e)) return;if (gOPD) return gOPD(t, e).value;}return t[e];},extend = function t() {var e,r,o,n,i,a,s = arguments[0],u = 1,l = arguments.length,h = !1;for ('boolean' == typeof s && ((h = s), (s = arguments[1] || {}), (u = 2)), (null == s || ('object' != typeof s && 'function' != typeof s)) && (s = {}); u < l; ++u)if (null != (e = arguments[u]))for (r in e)(o = getProperty(s, r)),s !== (n = getProperty(e, r)) && (h && n && (isPlainObject(n) || (i = isArray(n))) ? (i ? ((i = !1), (a = o && isArray(o) ? o : [])) : (a = o && isPlainObject(o) ? o : {}), setProperty(s, { name: r, newValue: t(h, a, n) })) : void 0 !== n && setProperty(s, { name: r, newValue: n }));return s;};
function QR8bitByte(t) {(this.mode = QRMode.MODE_8BIT_BYTE), (this.data = t);
}
function QRCode(t, e) {(this.typeNumber = t), (this.errorCorrectLevel = e), (this.modules = null), (this.moduleCount = 0), (this.dataCache = null), (this.dataList = new Array());
}
(QR8bitByte.prototype = {getLength: function (t) {return this.data.length;},write: function (t) {for (var e = 0; e < this.data.length; e++) t.put(this.data.charCodeAt(e), 8);},
}),(QRCode.prototype = {addData: function (t) {var e = new QR8bitByte(t);this.dataList.push(e), (this.dataCache = null);},isDark: function (t, e) {if (t < 0 || this.moduleCount <= t || e < 0 || this.moduleCount <= e) throw new Error(t + ',' + e);return this.modules[t][e];},getModuleCount: function () {return this.moduleCount;},make: function () {if (this.typeNumber < 1) {var t = 1;for (t = 1; t < 40; t++) {for (var e = QRRSBlock.getRSBlocks(t, this.errorCorrectLevel), r = new QRBitBuffer(), o = 0, n = 0; n < e.length; n++) o += e[n].dataCount;for (n = 0; n < this.dataList.length; n++) {var i = this.dataList[n];r.put(i.mode, 4), r.put(i.getLength(), QRUtil.getLengthInBits(i.mode, t)), i.write(r);}if (r.getLengthInBits() <= 8 * o) break;}this.typeNumber = t;}this.makeImpl(!1, this.getBestMaskPattern());},makeImpl: function (t, e) {(this.moduleCount = 4 * this.typeNumber + 17), (this.modules = new Array(this.moduleCount));for (var r = 0; r < this.moduleCount; r++) {this.modules[r] = new Array(this.moduleCount);for (var o = 0; o < this.moduleCount; o++) this.modules[r][o] = null;}this.setupPositionProbePattern(0, 0),this.setupPositionProbePattern(this.moduleCount - 7, 0),this.setupPositionProbePattern(0, this.moduleCount - 7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(t, e),this.typeNumber >= 7 && this.setupTypeNumber(t),null == this.dataCache && (this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)),this.mapData(this.dataCache, e);},setupPositionProbePattern: function (t, e) {for (var r = -1; r <= 7; r++)if (!(t + r <= -1 || this.moduleCount <= t + r)) for (var o = -1; o <= 7; o++) e + o <= -1 || this.moduleCount <= e + o || (this.modules[t + r][e + o] = (0 <= r && r <= 6 && (0 == o || 6 == o)) || (0 <= o && o <= 6 && (0 == r || 6 == r)) || (2 <= r && r <= 4 && 2 <= o && o <= 4));},getBestMaskPattern: function () {for (var t = 0, e = 0, r = 0; r < 8; r++) {this.makeImpl(!0, r);var o = QRUtil.getLostPoint(this);(0 == r || t > o) && ((t = o), (e = r));}return e;},createMovieClip: function (t, e, r) {var o = t.createEmptyMovieClip(e, r);this.make();for (var n = 0; n < this.modules.length; n++)for (var i = 1 * n, a = 0; a < this.modules[n].length; a++) {var s = 1 * a;this.modules[n][a] && (o.beginFill(0, 100), o.moveTo(s, i), o.lineTo(s + 1, i), o.lineTo(s + 1, i + 1), o.lineTo(s, i + 1), o.endFill());}return o;},setupTimingPattern: function () {for (var t = 8; t < this.moduleCount - 8; t++) null == this.modules[t][6] && (this.modules[t][6] = t % 2 == 0);for (var e = 8; e < this.moduleCount - 8; e++) null == this.modules[6][e] && (this.modules[6][e] = e % 2 == 0);},setupPositionAdjustPattern: function () {for (var t = QRUtil.getPatternPosition(this.typeNumber), e = 0; e < t.length; e++)for (var r = 0; r < t.length; r++) {var o = t[e],n = t[r];if (null == this.modules[o][n]) for (var i = -2; i <= 2; i++) for (var a = -2; a <= 2; a++) this.modules[o + i][n + a] = -2 == i || 2 == i || -2 == a || 2 == a || (0 == i && 0 == a);}},setupTypeNumber: function (t) {for (var e = QRUtil.getBCHTypeNumber(this.typeNumber), r = 0; r < 18; r++) {var o = !t && 1 == ((e >> r) & 1);this.modules[Math.floor(r / 3)][(r % 3) + this.moduleCount - 8 - 3] = o;}for (r = 0; r < 18; r++) {o = !t && 1 == ((e >> r) & 1);this.modules[(r % 3) + this.moduleCount - 8 - 3][Math.floor(r / 3)] = o;}},setupTypeInfo: function (t, e) {for (var r = (this.errorCorrectLevel << 3) | e, o = QRUtil.getBCHTypeInfo(r), n = 0; n < 15; n++) {var i = !t && 1 == ((o >> n) & 1);n < 6 ? (this.modules[n][8] = i) : n < 8 ? (this.modules[n + 1][8] = i) : (this.modules[this.moduleCount - 15 + n][8] = i);}for (n = 0; n < 15; n++) {i = !t && 1 == ((o >> n) & 1);n < 8 ? (this.modules[8][this.moduleCount - n - 1] = i) : n < 9 ? (this.modules[8][15 - n - 1 + 1] = i) : (this.modules[8][15 - n - 1] = i);}this.modules[this.moduleCount - 8][8] = !t;},mapData: function (t, e) {for (var r = -1, o = this.moduleCount - 1, n = 7, i = 0, a = this.moduleCount - 1; a > 0; a -= 2)for (6 == a && a--; ; ) {for (var s = 0; s < 2; s++)if (null == this.modules[o][a - s]) {var u = !1;i < t.length && (u = 1 == ((t[i] >>> n) & 1)), QRUtil.getMask(e, o, a - s) && (u = !u), (this.modules[o][a - s] = u), -1 == --n && (i++, (n = 7));}if ((o += r) < 0 || this.moduleCount <= o) {(o -= r), (r = -r);break;}}},}),(QRCode.PAD0 = 236),(QRCode.PAD1 = 17),(QRCode.createData = function (t, e, r) {for (var o = QRRSBlock.getRSBlocks(t, e), n = new QRBitBuffer(), i = 0; i < r.length; i++) {var a = r[i];n.put(a.mode, 4), n.put(a.getLength(), QRUtil.getLengthInBits(a.mode, t)), a.write(n);}var s = 0;for (i = 0; i < o.length; i++) s += o[i].dataCount;if (n.getLengthInBits() > 8 * s) throw new Error('code length overflow. (' + n.getLengthInBits() + '>' + 8 * s + ')');for (n.getLengthInBits() + 4 <= 8 * s && n.put(0, 4); n.getLengthInBits() % 8 != 0; ) n.putBit(!1);for (; !(n.getLengthInBits() >= 8 * s || (n.put(QRCode.PAD0, 8), n.getLengthInBits() >= 8 * s)); ) n.put(QRCode.PAD1, 8);return QRCode.createBytes(n, o);}),(QRCode.createBytes = function (t, e) {for (var r = 0, o = 0, n = 0, i = new Array(e.length), a = new Array(e.length), s = 0; s < e.length; s++) {var u = e[s].dataCount,l = e[s].totalCount - u;(o = Math.max(o, u)), (n = Math.max(n, l)), (i[s] = new Array(u));for (var h = 0; h < i[s].length; h++) i[s][h] = 255 & t.buffer[h + r];r += u;var f = QRUtil.getErrorCorrectPolynomial(l),g = new QRPolynomial(i[s], f.getLength() - 1).mod(f);a[s] = new Array(f.getLength() - 1);for (h = 0; h < a[s].length; h++) {var c = h + g.getLength() - a[s].length;a[s][h] = c >= 0 ? g.get(c) : 0;}}var d = 0;for (h = 0; h < e.length; h++) d += e[h].totalCount;var R = new Array(d),m = 0;for (h = 0; h < o; h++) for (s = 0; s < e.length; s++) h < i[s].length && (R[m++] = i[s][h]);for (h = 0; h < n; h++) for (s = 0; s < e.length; s++) h < a[s].length && (R[m++] = a[s][h]);return R;});
for (var QRMode = { MODE_NUMBER: 1, MODE_ALPHA_NUM: 2, MODE_8BIT_BYTE: 4, MODE_KANJI: 8 },QRErrorCorrectLevel = { L: 1, M: 0, Q: 3, H: 2 },QRMaskPattern = { PATTERN000: 0, PATTERN001: 1, PATTERN010: 2, PATTERN011: 3, PATTERN100: 4, PATTERN101: 5, PATTERN110: 6, PATTERN111: 7 },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: 1335,G18: 7973,G15_MASK: 21522,getBCHTypeInfo: function (t) {for (var e = t << 10; QRUtil.getBCHDigit(e) - QRUtil.getBCHDigit(QRUtil.G15) >= 0; ) e ^= QRUtil.G15 << (QRUtil.getBCHDigit(e) - QRUtil.getBCHDigit(QRUtil.G15));return ((t << 10) | e) ^ QRUtil.G15_MASK;},getBCHTypeNumber: function (t) {for (var e = t << 12; QRUtil.getBCHDigit(e) - QRUtil.getBCHDigit(QRUtil.G18) >= 0; ) e ^= QRUtil.G18 << (QRUtil.getBCHDigit(e) - QRUtil.getBCHDigit(QRUtil.G18));return (t << 12) | e;},getBCHDigit: function (t) {for (var e = 0; 0 != t; ) e++, (t >>>= 1);return e;},getPatternPosition: function (t) {return QRUtil.PATTERN_POSITION_TABLE[t - 1];},getMask: function (t, e, r) {switch (t) {case QRMaskPattern.PATTERN000:return (e + r) % 2 == 0;case QRMaskPattern.PATTERN001:return e % 2 == 0;case QRMaskPattern.PATTERN010:return r % 3 == 0;case QRMaskPattern.PATTERN011:return (e + r) % 3 == 0;case QRMaskPattern.PATTERN100:return (Math.floor(e / 2) + Math.floor(r / 3)) % 2 == 0;case QRMaskPattern.PATTERN101:return ((e * r) % 2) + ((e * r) % 3) == 0;case QRMaskPattern.PATTERN110:return (((e * r) % 2) + ((e * r) % 3)) % 2 == 0;case QRMaskPattern.PATTERN111:return (((e * r) % 3) + ((e + r) % 2)) % 2 == 0;default:throw new Error('bad maskPattern:' + t);}},getErrorCorrectPolynomial: function (t) {for (var e = new QRPolynomial([1], 0), r = 0; r < t; r++) e = e.multiply(new QRPolynomial([1, QRMath.gexp(r)], 0));return e;},getLengthInBits: function (t, e) {if (1 <= e && e < 10)switch (t) {case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:case QRMode.MODE_KANJI:return 8;default:throw new Error('mode:' + t);}else if (e < 27)switch (t) {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:' + t);}else {if (!(e < 41)) throw new Error('type:' + e);switch (t) {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:' + t);}}},getLostPoint: function (t) {for (var e = t.getModuleCount(), r = 0, o = 0; o < e; o++)for (var n = 0; n < e; n++) {for (var i = 0, a = t.isDark(o, n), s = -1; s <= 1; s++) if (!(o + s < 0 || e <= o + s)) for (var u = -1; u <= 1; u++) n + u < 0 || e <= n + u || (0 == s && 0 == u) || (a == t.isDark(o + s, n + u) && i++);i > 5 && (r += 3 + i - 5);}for (o = 0; o < e - 1; o++)for (n = 0; n < e - 1; n++) {var l = 0;t.isDark(o, n) && l++, t.isDark(o + 1, n) && l++, t.isDark(o, n + 1) && l++, t.isDark(o + 1, n + 1) && l++, (0 != l && 4 != l) || (r += 3);}for (o = 0; o < e; o++) for (n = 0; n < e - 6; n++) t.isDark(o, n) && !t.isDark(o, n + 1) && t.isDark(o, n + 2) && t.isDark(o, n + 3) && t.isDark(o, n + 4) && !t.isDark(o, n + 5) && t.isDark(o, n + 6) && (r += 40);for (n = 0; n < e; n++) for (o = 0; o < e - 6; o++) t.isDark(o, n) && !t.isDark(o + 1, n) && t.isDark(o + 2, n) && t.isDark(o + 3, n) && t.isDark(o + 4, n) && !t.isDark(o + 5, n) && t.isDark(o + 6, n) && (r += 40);var h = 0;for (n = 0; n < e; n++) for (o = 0; o < e; o++) t.isDark(o, n) && h++;return (r += 10 * (Math.abs((100 * h) / e / e - 50) / 5));},},QRMath = {glog: function (t) {if (t < 1) throw new Error('glog(' + t + ')');return QRMath.LOG_TABLE[t];},gexp: function (t) {for (; t < 0; ) t += 255;for (; t >= 256; ) t -= 255;return QRMath.EXP_TABLE[t];},EXP_TABLE: new Array(256),LOG_TABLE: new Array(256),},i = 0;i < 8;i++
)QRMath.EXP_TABLE[i] = 1 << i;
for (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 (i = 0; i < 255; i++) QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
function QRPolynomial(t, e) {if (void 0 == t.length) throw new Error(t.length + '/' + e);for (var r = 0; r < t.length && 0 == t[r]; ) r++;this.num = new Array(t.length - r + e);for (var o = 0; o < t.length - r; o++) this.num[o] = t[o + r];
}
function QRRSBlock(t, e) {(this.totalCount = t), (this.dataCount = e);
}
function QRBitBuffer() {(this.buffer = new Array()), (this.length = 0);
}
function utf16to8(t) {var e, r, o, n;for (e = '', o = t.length, r = 0; r < o; r++)(n = t.charCodeAt(r)) >= 1 && n <= 127? (e += t.charAt(r)): n > 2047? ((e += String.fromCharCode(224 | ((n >> 12) & 15))), (e += String.fromCharCode(128 | ((n >> 6) & 63))), (e += String.fromCharCode(128 | ((n >> 0) & 63)))): ((e += String.fromCharCode(192 | ((n >> 6) & 31))), (e += String.fromCharCode(128 | ((n >> 0) & 63))));return e;
}
function drawQrcode(t) {(t = t || {}),(t = extend(!0, { width: 256, height: 256, x: 0, y: 0, typeNumber: -1, correctLevel: QRErrorCorrectLevel.H, background: '#ffffff', foreground: '#000000', image: { imageResource: '', dx: 0, dy: 0, dWidth: 100, dHeight: 100 } }, t)).canvasId || t.ctx? (function () {var e,r = new QRCode(t.typeNumber, t.correctLevel);r.addData(utf16to8(t.text)), r.make(), (e = t.ctx ? t.ctx : t._this ? wx.createCanvasContext && wx.createCanvasContext(t.canvasId, t._this) : wx.createCanvasContext && wx.createCanvasContext(t.canvasId));for (var o = t.width / r.getModuleCount(), n = t.height / r.getModuleCount(), i = 0; i < r.getModuleCount(); i++)for (var a = 0; a < r.getModuleCount(); a++) {var s = r.isDark(i, a) ? t.foreground : t.background;e.setFillStyle(s);var u = Math.ceil((a + 1) * o) - Math.floor(a * o),l = Math.ceil((i + 1) * o) - Math.floor(i * o);e.fillRect(Math.round(a * o) + t.x, Math.round(i * n) + t.y, u, l);}t.image.imageResource && e.drawImage(t.image.imageResource, t.image.dx, t.image.dy, t.image.dWidth, t.image.dHeight);e.draw(!1, function (e) {t.callback && t.callback(e);});})(): console.warn('please set canvasId or ctx!');
}
(QRPolynomial.prototype = {get: function (t) {return this.num[t];},getLength: function () {return this.num.length;},multiply: function (t) {for (var e = new Array(this.getLength() + t.getLength() - 1), r = 0; r < this.getLength(); r++) for (var o = 0; o < t.getLength(); o++) e[r + o] ^= QRMath.gexp(QRMath.glog(this.get(r)) + QRMath.glog(t.get(o)));return new QRPolynomial(e, 0);},mod: function (t) {if (this.getLength() - t.getLength() < 0) return this;for (var e = QRMath.glog(this.get(0)) - QRMath.glog(t.get(0)), r = new Array(this.getLength()), o = 0; o < this.getLength(); o++) r[o] = this.get(o);for (o = 0; o < t.getLength(); o++) r[o] ^= QRMath.gexp(QRMath.glog(t.get(o)) + e);return new QRPolynomial(r, 0).mod(t);},
}),(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 (t, e) {var r = QRRSBlock.getRsBlockTable(t, e);if (void 0 == r) throw new Error('bad rs block @ typeNumber:' + t + '/errorCorrectLevel:' + e);for (var o = r.length / 3, n = new Array(), i = 0; i < o; i++) for (var a = r[3 * i + 0], s = r[3 * i + 1], u = r[3 * i + 2], l = 0; l < a; l++) n.push(new QRRSBlock(s, u));return n;}),(QRRSBlock.getRsBlockTable = function (t, e) {switch (e) {case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[4 * (t - 1) + 0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[4 * (t - 1) + 1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[4 * (t - 1) + 2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[4 * (t - 1) + 3];default:return;}}),(QRBitBuffer.prototype = {get: function (t) {var e = Math.floor(t / 8);return 1 == ((this.buffer[e] >>> (7 - (t % 8))) & 1);},put: function (t, e) {for (var r = 0; r < e; r++) this.putBit(1 == ((t >>> (e - r - 1)) & 1));},getLengthInBits: function () {return this.length;},putBit: function (t) {var e = Math.floor(this.length / 8);this.buffer.length <= e && this.buffer.push(0), t && (this.buffer[e] |= 128 >>> this.length % 8), this.length++;},});
export default drawQrcode;
相关文章:

微信小程序生成二维码并保存到本地方法
微信小程序生成二维码请保存到本地方法 官方weapp-qrcode插件 github链接 功能完成样子 wxml <view class"qrcode"><canvas style"width: 275px; height: 275px;" canvas-idmyQrcode></canvas> </view> <view class" …...
shell_exec 和 exec区别
shell_exec 和 exec 都是用于在 PHP 中执行系统命令的函数,但它们之间有一些区别。 返回值类型:shell_exec 函数返回命令的输出结果作为字符串,而 exec 函数将输出结果存储在数组中。 输出结果:shell_exec 函数返回命令的完整输出…...

WPF创建进度条
使用wpf做一个原生的进度条,进度条上面有值,先看效果。 功能就是点击按钮,后台处理数据,前台显示处理数据的变化,当然还可以对进度条进行美化和关闭的操作,等待后台处理完毕数据,然后自动关闭。…...

全网最新最全面的Appium自动化:Appium常用操作之混合应用webview页面操作--待补充!
上下文操作: 在appium中,对于混合应用,需要进行WebView页面和原生应用的切换 常用的方法如下: 1、context(self) / current_context(self):返回当前会话的当前上下文,context可以理解为可进入的窗口。对于…...

基于OpenCV+YOLOv5实现车辆跟踪与计数(附源码)
导 读 本文主要介绍基于OpenCVYOLOv5实现车辆跟踪与计数的应用,并给出源码。 资源下载 基础代码和视频下载地址: https://github.com/freedomwebtech/win11vehiclecount main.py代码: import cv2import torchimport numpy as npfrom tr…...

05、pytest断言确定的异常
官方用例 # content of test_sysexit.py import pytestdef f():raise SystemExit(1)def test_mytest():with pytest.raises(SystemExit):f()解读与实操 标准python raise函数可产生异常。pytest.raises可以断言某个异常会发现。异常发生了,用例执行成功&#x…...

金蝶云星空单据编辑界面,不允许批量填充操作
文章目录 金蝶云星空单据编辑界面,不允许批量填充操作案例演示开发设计测试 金蝶云星空单据编辑界面,不允许批量填充操作 案例演示 售后单,明细信息单据体,物料编码字段禁止批量填充。 开发设计 编写表单插件,在Be…...
Springboot项目启动成功后可通过五种方式继续执行
实现CommandLineRunner接口 项目初始化完毕后,才会调用方法,提供服务 Component public class StartRunner implements CommandLineRunner {Overridepublic void run(String... args) throws Exception {System.out.println("CommandLineRunner&qu…...
什么是供应链金融分账系统?
一、供应链金融的重要性 供应链金融在很多行业都是要用到,比如在抖音,快手店铺的商家资金回笼,通常需要7-21天的回款周期,这对于商家的周转来说是一件很困难的事情,在供应链金融中,分账就扮演着至关重要的角色,不仅是金融流程中的一环,更是保…...
【测绘程序设计】——坐标换带与高程投影
测绘工程中经常遇到 “坐标换带” 与 “高程投影” 问题,前者是在改变投影的分带号——即投影的中央子午线,通过 “(x,y)->(B,L)->(x,y)” 进行;而后者则是为减小投影变形(高程投影变短、高斯投影变长,详情可参考博客《测绘综合能力》真题易错本 第(37)条)通过平…...

企业计算机服务器中了Mallox勒索病毒如何解密,Mallox勒索病毒数据恢复
随着计算机技术的不断应用与发展,网络为企业的生产运营提供了极大帮助,越来越多的企业开始利用网络办公,因此,随之而来的网络安全威胁也在不断增加。近期,云天数据恢复中心陆续接到很多企业的求助,企业的计…...

一套rk3588 rtsp服务器推流的 github 方案及记录 -01
我不生产代码,我只是代码的搬运工,相信我,看完这个文章你的图片一定能变成流媒体推出去。 诉求:使用opencv拉流,转成bgr数据,需要把处理后的数据(BGR)编码成264,然后推流…...

PyQt6 QComboBox下拉组合框控件
锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计34条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…...
常用类与比较器
常用类 学一个类,先搞清楚继承关系,再看源码 包装类Wrapper jdk5之前是手动装箱拆箱 jdk5及之后是自动装箱拆箱(调用valueOf方法(自动默认)/创建对象的构造方法,XXXvalue方法…...

【上海大学《面向对象程序设计A》课程小项目报告】抽象向量类模板及其派生类
1 项目内容及要求 本项目通过设计一个抽象向量类模板,以及一个通用的向量类模板和一个字符串类作为其派生类,以满足各种应用场景中的数据存储和处理需求。 项目内容: 抽象向量类模板。派生向量类。派生字符串类。测试及异常处理。联合测试…...

Leetcode每日一题学习训练——Python3版(到达首都的最少油耗)
版本说明 当前版本号[20231205]。 版本修改说明20231205初版 目录 文章目录 版本说明目录到达首都的最少油耗理解题目代码思路参考代码 原题可以点击此 2477. 到达首都的最少油耗 前去练习。 到达首都的最少油耗 给你一棵 n 个节点的树(一个无向、连通、无环…...
Java面试题(每天10题)-------连载(42)
目录 Spring篇 1、Spring Bean的作用域之间有什么区别? 2、什么是Spring inner beans? 3、Spring框架中的单例Beans是线程安全的吗? 4、请举例说明如何在Spring中诸如一个Java Collection? 5、如何向Spring Bean中诸如一个J…...
netty websocket学习
【硬核】肝了一月的Netty知识点 超详细Netty入门,看这篇就够了! bzm_netty_sb netty-chat vuewebsokect实现实时聊天,可单聊、可群聊(一) vue实现聊天栏定位到最底部(超简单、可直接复制使用)…...

【数据结构】环形队列
环形队列 1. 定义 环形队列就是将队列在逻辑上看作环形结构、物理上仍是数组形式存储的一种数据结构。 其实现主要分为两种情况: 浪费空间法记录空间法 2. 实现 实现要考虑的是成员变量 2.1 记录空间法 使用used标识当前存储了多少元素,如果为空&a…...

嵌入式C编码规范
嵌入式C编码规范 编码规范,没有最好,只有最合适,有但不执行不如没有。 嵌入式C编码规范 https://mp.weixin.qq.com/s/z4u3YnF6vdQ1olsLeF-y_A 更多嵌入式信息请关注微信公众号【嵌入式系统】...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...