碧桂园
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 regels
1.8 KiB

  1. export class CrsClient {
  2. /**
  3. * @param config { {cloudKey: string, token: string, clientHost: string, jpegQuality: number} }
  4. * @param canvas { HTMLCanvasElement }
  5. */
  6. constructor(config, canvas) {
  7. this.config = config;
  8. this.canvas = canvas;
  9. this.context = canvas.getContext('2d');
  10. }
  11. /**
  12. * 发起一次CRS请求
  13. * @param frame { {data: ArrayBuffer, height: number, width: number} } 相机帧
  14. * @return {Promise}
  15. */
  16. queryImage(frame) {
  17. /*
  18. * 从相机帧开始,发起一次CRS请求的步骤:
  19. * 1. 将相机帧画到canvas上
  20. * 2. 调用canvas.toDataURL得到JPEG图片的base64 (需要小程序基础库2.12.0及以上)
  21. * 3. 填充请求参数
  22. * 4. 发送CRS请求并返回
  23. */
  24. let ctxImageData = this.context.createImageData(frame.width, frame.height); //#1
  25. ctxImageData.data.set(new Uint8ClampedArray(frame.data)); //#1
  26. this.context.putImageData(ctxImageData, 0, 0); //#1
  27. let dataUrl = this.canvas.toDataURL("image/jpeg", this.config.quality); //#2
  28. let base64 = dataUrl.substr(23); //#2 去除dataURL头,留下文件内容
  29. const params = { //#3 添加cloudKey参数
  30. image: base64,
  31. notracking: "true",
  32. appId: this.config.crsAppId
  33. };
  34. return new Promise((resolve, reject) => { //#4 发送CRS请求
  35. wx.request({
  36. url: `${this.config.clientHost}/search/`,
  37. method: 'post',
  38. data: params,
  39. header: {
  40. 'Authorization': this.config.token,
  41. 'content-type': 'application/json'
  42. },
  43. success: res => resolve(res.data),
  44. fail: err => reject(err)
  45. });
  46. });
  47. }
  48. }