export class CrsClient { /** * @param config { {cloudKey: string, token: string, clientHost: string, jpegQuality: number} } * @param canvas { HTMLCanvasElement } */ base64_decode(input) { // 解码,配合decodeURIComponent使用 var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = base64EncodeChars.indexOf(input.charAt(i++)); enc2 = base64EncodeChars.indexOf(input.charAt(i++)); enc3 = base64EncodeChars.indexOf(input.charAt(i++)); enc4 = base64EncodeChars.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } } return this.utf8_decode(output); } utf8_decode(utftext) { // utf-8解码 var string = ''; let i = 0; let c = 0; let c1 = 0; let c2 = 0; while (i < utftext.length) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if ((c > 191) && (c < 224)) { c1 = utftext.charCodeAt(i + 1); string += String.fromCharCode(((c & 31) << 6) | (c1 & 63)); i += 2; } else { c1 = utftext.charCodeAt(i + 1); c2 = utftext.charCodeAt(i + 2); string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)); i += 3; } } return string; } constructor(config, canvas) { this.config = config; this.canvas = canvas; this.context = canvas.getContext('2d'); } /** * 发起一次CRS请求 * @param frame { {data: ArrayBuffer, height: number, width: number} } 相机帧 * @return {Promise} */ queryImage(frame) { /* * 从相机帧开始,发起一次CRS请求的步骤: * 1. 将相机帧画到canvas上 * 2. 调用canvas.toDataURL得到JPEG图片的base64 (需要小程序基础库2.12.0及以上) * 3. 填充请求参数 * 4. 发送CRS请求并返回 */ let ctxImageData = this.context.createImageData(frame.width, frame.height); //#1 ctxImageData.data.set(new Uint8ClampedArray(frame.data)); //#1 this.context.putImageData(ctxImageData, 0, 0); //#1 let dataUrl = this.canvas.toDataURL("image/jpeg", this.config.quality); //#2 let base64 = dataUrl.substr(23); //#2 去除dataURL头,留下文件内容 const params = { //#3 添加cloudKey参数 image: base64, notracking: "true", appId: '20239cb7aa12abd58af820458711fea0' }; return new Promise((resolve, reject) => { //#4 发送CRS请求 let token = wx.getStorageSync('token') console.log(token); wx.request({ url: `http://6db69340022abbad5fa30787b96a3d4b.cn1.crs.easyar.com:8080/search/`, method: 'post', data: params, header: { 'Authorization': token, 'content-type': 'application/json' }, success: res => { console.log(res, '成功'); var base64 = res.data.result.target.meta console.log(res.data.result.target.meta, '123123'); let web = this.base64_decode(base64) console.log(this.base64_decode(base64)); let index = 2 wx.navigateTo({ url: '../out/index?web=' + web + '&index=' + index, }) }, fail: err => { console.log(err); }, }); }); } }