小程序端接入
接入小程序项目
步骤1:配置域名白名单
SDK 内部会请求后台进行鉴权和资源加载,需要在小程序后台配置域名白名单。
1. 进入 小程序后台,进入 开发 > 开发管理 > 开发设置 > 服务器域名。
2. 单击修改,配置以下域名并保存。
请求域名:
https://webar.qcloud.com;https://webar-static.tencent-cloud.com;https://aegis.qq.com;以及上述签名接口(get-ar-sign)的地址
downloadFile 域名:
https://webar-static.tencent-cloud.com
步骤2:安装并构建 npm
1. 安装:
npm install tencentcloud-webar
2. 单击开发者工具菜单 > 工具 > 构建 npm。
3. 在 app.json 中配置 workers 路径:
"workers": "miniprogram_npm/tencentcloud-webar/worker"
步骤3:引入文件
// 0.3.0之前版本引用方式(1个文件)// import "../../miniprogram_npm/tencentcloud-webar/lib.js";// 0.3.0及之后版本引用方式(2个文件 + 按需初始化3d模块)import '../../miniprogram_npm/tencentcloud-webar/lib.js';import '../../miniprogram_npm/tencentcloud-webar/core.js';// 按需初始化3d插件,如果不需要3d则可以不引用import '../../miniprogram_npm/tencentcloud-webar/lib-3d.js';import { plugin3d } from '../../miniprogram_npm/tencentcloud-webar/plugin-3d'// 导入 ArSdkimport { ArSdk } from "../../miniprogram_npm/tencentcloud-webar/index.js";
注意
小程序有单文件不超过 500kb 的限制,因此 SDK 分为多个 js 文件提供。
0.3.0版本之后,对 SDK 进行了进一步的拆分,新增3D支持,针对3D模块提供按需加载方式,导入前请确认当前使用的 SDK 版本信息,选择对应的导入方式。
步骤4:初始化实例
// wxml//打开相机<cameradevice-position="{{'front'}}"frame-size="large" flash="off" resolution="medium"style="width: 750rpx; height: 134rpx;position:absolute;top:-9999px;"/>//sdk 将处理完的画面实时输出到此 canvas 上<canvastype="webgl"canvas-id="main-canvas"id="main-canvas"style="width: 750rpx; height: 1334rpx;"></canvas>//拍照将 ImageData 对象绘制到此 canvas 上<canvastype="2d"canvas-id="photo-canvas"id="photo-canvas"style="position:absolute;width:720px;height:1280px;top:-9999px;left:-9999px;"></canvas>// jsComponent({methods: {async getCanvasNode(id) {return new Promise((resolve) => {this.createSelectorQuery().select(`#${id}`).node().exec((res) => {const canvasNode = res[0].node;resolve(canvasNode);});});},// 初始化相机类型async initSdkCamera() {// 获取在屏的 canvas,sdk 会将处理完的画面实时输出到 canvas 上const outputCanvas = await this.getCanvasNode("main-canvas");const sdk = new ArSdk({camera: {width:720,height:1280,},output: outputCanvas,loading: {enable: false,},auth: {licenseKey: LICENSE_KEY,appId: APP_ID,authFunc: authFunc},plugin3d: plugin3d // 0.3.0之后版本写法,按需初始化3d模块,如不需要3d模块,可以省略此参数。});this.sdk = sdksdk.setBeautify({whiten: 0.2});sdk.on('created', () => {// 可以在回调中处理业务逻辑,详见[参数与方法]()})}}})
注意
小程序初始化 SDK 前须在控制台配置小程序 APPID。
由于小程序的特性与 Web 不同,因此小程序支持的 input 参数目前只有
string
类型的图片链接。相机配置与 Web 相同,input 参数不传,直接设置 camera 参数,前提是页面中必须插入 camera 标签。
小程序不支持 getOutput,需要自行传入一个在屏的 WEBGL canvas,SDK 直接输出到此 canvas。
拍照与录像
小程序端支持拍照和录像功能。
SDK 会返回包含宽高和 buffer 数据的对象,用户可以通过自己页面内的 2d canvas 绘制此数据并导出为图片文件。
Component({...async takePhoto() {const {uint8ArrayData, width, height} = this.sdk.takePhoto(); // takePhoto 方法返回当前画面的 buffer 数据const photoCanvasNode = await this.getCanvasNode('photo-canvas');photoCanvasNode.width = parseInt(width);photoCanvasNode.height = parseInt(height);const ctx = photoCanvasNode.getContext('2d');// 用 sdk 返回的数据创建 ImageData 对象const imageData = photoCanvasNode.createImageData(uint8ArrayData, width, height);// 将 ImageData 对象绘制到 canvas 上ctx.putImageData(imageData,0,0,0,0,width,height);// 将 canvas 保存为本地图片wx.canvasToTempFilePath({canvas: photoCanvasNode,x: 0,y: 0,width: width,height: height,destWidth: width,destHeight: height,success: (res) => {// 保存照片到本地wx.saveImageToPhotosAlbum({filePath: res.tempFilePath});}})}})
注意
当小程序切换后台或检测到手机锁屏时,需要调用 stopRecord 停止录像,否则可能出错。
Component({methods: {// 开始录像startRecord() {this.sdk.startRecord()}// 结束录像async stopRecord() {const res = await this.sdk.stopRecord();// 保存录像到本地wx.saveVideoToPhotosAlbum({filePath: res.tempFilePath})}}})