뷰티 AR Web을 미니프로그램에 통합
준비 작업
미니프로그램 개발을 시작하는 방법에 대한 자세한 내용은 Weixin 미니프로그램 문서를 참고하십시오.
뷰티 AR Web SDK 사용 방법에 대해 알아보려면 통합 가이드를 읽어보십시오.
시작하기
1단계: 미니프로그램 백엔드에서 도메인 얼로우리스트 구성
SDK는 백엔드에 인증 및 리소스 로딩을 요청하므로 미니프로그램 생성 완료 후 미니프로그램 백엔드에서 도메인 얼로우리스트를 구성해야 합니다.
1. 미니프로그램 백엔드를 열고 개발 > 개발 관리 > 개발 설정 > 서버 도메인 이름으로 이동합니다.
2. 수정을 클릭하고 다음 도메인 이름을 구성한 후 저장합니다.
요청 도메인 이름:
https://webar.qcloud.com;https://webar-static.tencent-cloud.com;https://aegis.qq.com;인증 서명 API의 URL(get-ar-sign)
downloadFile 도메인 이름:
https://webar-static.tencent-cloud.com
2단계: SDK 설치 및 npm 빌드
1. 설치:
npm install tencentcloud-webar
2. 빌드:
DevTools 툴을 열고 상단 표시줄에서 툴 > 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 이상 버전 가져오기 방법(필요에 따라 초기화할 수 있는 두 개의 파일 + 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'// ArSdk 가져오기import { ArSdk } from "../../miniprogram_npm/tencentcloud-webar/index.js";
주의사항
미니프로그램은 하나의 파일이 500kb를 초과할 수 없도록 요구하므로 SDK는 두 개의 js 파일을 통해 제공됩니다.
v0.3.0부터 SDK가 3D를 지원하도록 더 분할되었습니다. 필요에 따라 3D 모듈을 로딩할 수 있습니다. 가져오기 전에 SDK 버전을 확인하고 해당 가져오기 방법을 사용하십시오.
4단계: SDK 초기화
주의사항
미니프로그램에서 SDK를 초기화하기 전에 시작하기의 지침에 따라 콘솔에서 미니프로그램 APPID를 구성해야 합니다.
페이지에 camera 레이블을 삽입하여 camera를 연 다음 통합 가이드에 설명된 대로 camera 매개변수를 설정해야 합니다.
미니프로그램은 getOutput을 지원하지 않으므로 온스크린 webgl canvas를 전달해야 하며 SDK는 이미지를 이 canvas에 직접 출력합니다.
예시 코드는 다음과 같습니다.
// wxml// 카메라를 열고 position을 통해 숨깁니다<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>// js/** ----- 인증 구성 ----- *//*** Tencent Cloud 계정의 APPID** [계정 센터](https://console.cloud.tencent.com/developer)로 이동하여 APPID를 확인합니다*/const APPID = ''; // 자신의 매개변수 입력/*** Web LicenseKey** RT-Cube 콘솔의 [Web License 관리](https://console.cloud.tencent.com/vcube/web) 페이지에서 LicenseKey를 받을 프로젝트를 생성합니다.*/const LICENSE_KEY = ''; // 자신의 매개변수 입력/*** 서명을 계산하는 데 사용되는 Token** 참고: 여기서는 DEMO 디버깅에만 사용됩니다. 프로덕션 환경에서는 Token을 서버에 보관하고 서버에서 서명 알고리즘을 구현하고 API를 통해 프런트엔드가 서명을 가져오기 위해 호출하도록 제공합니다. 자세한 내용은 다음을 참고하십시오.* [서명 알고리즘](https://cloud.tencent.com/document/product/616/71370#.E7.AD.BE.E5.90.8D.E6.96.B9.E6.B3.95)*/const token = ''; // 자신의 매개변수 입력Component({data: {makeupList: [],stickerList: [],filterList: [],recording: false},methods: {async getCanvasNode(id) {return new Promise((resolve) => {this.createSelectorQuery().select(`#${id}`).node().exec((res) => {const canvasNode = res[0].node;resolve(canvasNode);});});},getSignature() {const timestamp = Math.round(new Date().getTime() / 1000);const signature = sha256(timestamp + token + APPID + timestamp).toUpperCase();return { signature, timestamp };},// 카메라 유형 초기화async initSdkCamera() {// 화면 canvas를 가져옵니다. sdk는 처리된 이미지를 실시간으로 canvas에 출력합니다.const outputCanvas = await this.getCanvasNode("main-canvas");// 인증 정보 가져오기const auth = {licenseKey: LICENSE_KEY,appId: APP_ID,authFunc: this.getSignature};// SDK 초기화 매개변수 구성const config = {auth,camera: {width:720,height:1280,},output: outputCanvas,// 초기 뷰티 효과(선택사항)beautify: {whiten: 0.1, // 브라이트닝 효과. 값 범위: 0-1dermabrasion: 0.3, // 매끄러운 피부 효과. 값 범위: 0-1lift: 0, // 날씬한 얼굴 효과. 값 범위: 0-1shave: 0, // V 라인 효과. 값 범위: 0-1eye: 0.2, // 큰 눈 효과. 값 범위: 0–1chin: 0, // 턱 효과. 값 범위: 0–1}};const ar = new ArSdk(config);// 내장 효과 및 필터 목록은 created 콜백에서 가져올 수 있습니다ar.on('created', () => {// 내장된 메이크업 효과 및 스티커 목록 가져오기ar.getEffectList({Type: 'Preset'}).then((res) => {const list = res.map(item => ({name: item.Name,id: item.EffectId,cover: item.CoverUrl,url: item.Url,label: item.Label,type: item.PresetType,}));const makeupList = list.filter(item=>item.label.indexOf('메이크업')>=0)const stickerList = list.filter(item=>item.label.indexOf('스티커')>=0)// 효과 목록 렌더링this.setData({makeupList,stickerList});}).catch((e) => {console.log(e);});// 내장 필터ar.getCommonFilter().then((res) => {const list = res.map(item => ({name: item.Name,id: item.EffectId,cover: item.CoverUrl,url: item.Url,label: item.Label,type: item.PresetType,}));// 필터 목록 렌더링this.setData({filterList: list});}).catch((e) => {console.log(e);});});// ready 콜백에서 뷰티 필터 및 효과를 설정할 수 있습니다.ar.on('ready', (e) => {this._sdkReady = true});ar.on('error', (e) => {console.log(e);});this.ar = ar},// 뷰티 필터 매개변수를 변경합니다. sdk가 ready되었는지 확인해야 합니다.onChangeBeauty(val){if(!this._sdkReady) return// setBeautify를 통해 뷰티 효과를 설정할 수 있습니다. 6개의 속성이 지원됩니다. 자세한 내용은 SDK 통합 가이드를 참고하십시오.this.ar.setBeautify({dermabrasion: val.dermabrasion, // 매끄러운 피부 효과. 값 범위: 0–1});},// 메이크업 스타일을 변경합니다. sdk가 ready되었는지 확인하십시오.onChangeMakeup(id, intensity){if(!this._sdkReady) return// setEffect를 사용하여 효과를 구성합니다. setEffect의 입력 매개변수는 SDK 통합 가이드에 설명된 대로 세 가지 형식일 수 있습니다.this.ar.setEffect([{id, intensity}]);},// 스티커를 변경합니다. sdk가 ready되었는지 확인하십시오.onChangeSticker(id, intensity){if(!this._sdkReady) return// setEffect를 사용하여 효과를 구성합니다. setEffect의 입력 매개변수는 SDK 통합 가이드에 설명된 대로 세 가지 형식일 수 있습니다.this.ar.setEffect([{id, intensity}]);},// 필터를 변경합니다. sdk가 ready되었는지 확인하십시오.onChangeFilter(id, intensity){if(!this._sdkReady) return// setFilter를 사용하여 필터를 구성합니다. 두 번째 매개변수는 필터 강도를 나타냅니다. 값 범위: 0–1this.ar.setFilter(id, 1);}}})
5단계: 사진 캡처 및 녹화 기능 구현
예시 코드는 다음과 같습니다.
SDK는 너비, 높이 및 buffer 데이터를 포함하는 객체를 반환하며 페이지의 사전 설정된 2d canvas(위 코드에서 id는 photo-canvas)에 데이터를 그리고 이미지 파일로 내보낼 수 있습니다.
async takePhoto() {const {uint8ArrayData, width, height} = this.ar.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);// canvas에 ImageData 객체를 그립니다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});}})}
Component({methods: {// 레코딩 시작startRecord() {this.setData({recording: true});this.ar.startRecord()}// 레코딩 중지async stopRecord() {const res = await this.ar.stopRecord();// 레코딩 저장wx.saveVideoToPhotosAlbum({filePath: res.tempFilePath});this.setData({recording: false});}}})
미니프로그램이 백그라운드로 전환되거나 화면이 잠긴 경우 stopRecord를 호출하여 레코딩을 중지하고 다시 페이지를 열면 SDK를 다시 시작할 수 있습니다.
onShow() {this.ar && this.ar.start();},onHide() {this.ar && this.ar.stop();},async onUnload() {try {this.ar && this.ar.stop();if (this.data.recording) {await this.ar.stopRecord({destroy: true,});}} catch (e) {}this.ar && this.ar.destroy();}