Queen Web SDK是一个Web端美颜特效组件,支持基础美颜、高级美颜、人脸美妆、人脸美型、头像贴纸、美体、背景抠图、滤镜、隔空写字、Animoji等美颜功能。本文介绍在Web端接入美颜特效SDK。
准备工作
申请试用LicenseKey,获取方式请参见获取美颜特效SDK License。
下载美颜特效Web SDK包并解压,请参见下载美颜特效SDK。
导入Queen SDK。具体操作,请参见通过NPM导入Queen SDK。
通过NPM导入Queen SDK
安装Queen美颜组件
npm install aliyun-queen-engine
导入默认版本美颜
默认版本(Advance版本)支持基础美颜、高级美颜、美妆、美型、滤镜、贴纸美颜功能。
不同的版本包大小和加载的资源文件不同,功能越全包大小越大,请根据实际情况进行选择。
import QueenEngine, {kQueenBeautyType, kQueenBeautyParams, kQueenBeautyMakeupType, kQueenBeautyFaceShapeType, kQueenBeautyBlend} from "aliyun-queen-engine"
queenEngine = new QueenEngine();
导入Lite版本美颜
Lite版本仅支持基础美颜功能。
import {QueenEngineLite, kQueenBeautyType, kQueenBeautyParams} from "aliyun-queen-engine"
queenEngine = new QueenEngineLite();
导入Pro版本美颜
Pro版本支持基础美颜、高级美颜、美妆、美型、美体、滤镜、贴纸、隔空写字、抠图美颜功能。
import {QueenEnginePro, kQueenBeautyType, kQueenBeautyParams, kQueenBeautyMakeupType, kQueenBeautyFaceShapeType, kQueenBeautyBodyShapeType, kQueenBeautyBlend} from "aliyun-queen-engine"
queenEngine = new QueenEnginePro();
导入Full版本美颜
Full版本支持基础美颜、高级美颜、美妆、美型、美体、滤镜、贴纸、隔空写字、抠图美颜、Animoji功能。
import {QueenEngineFull, kQueenBeautyType, kQueenBeautyParams, kQueenBeautyMakeupType, kQueenBeautyFaceShapeType, kQueenBeautyBodyShapeType, kQueenBeautyBlend} from "aliyun-queen-engine"
queenEngine = new QueenEngineFull();
导入Worker版本美颜
Worker版本通过初始化时传入kQueenVersion指定Lite、Advance、Pro、Full版本。
import {QueenEngineWorker, kQueenBeautyType, kQueenBeautyParams, kQueenBeautyMakeupType, kQueenBeautyFaceShapeType, kQueenBeautyBodyShapeType, kQueenBeautyBlend, kQueenVersion} from "aliyun-queen-engine"
queenEngine = new QueenEngineWorker(kQueenVersion.Pro);
HTML版本接入
HTML版本中SDK使用到的枚举需要增加QueenEngine前缀,如:queenEngine.setQueenBeautyParams(QueenEngine.kQueenBeautyParams.Wrinkles, 0.9);
。
//Lite版:
<script src="https://g.alicdn.com/apsara-media-box/imp-web-queen-wasm/6.2.2/dist/js/aliyun-queen-engine-lite.js"></script>
//Advance版:
<script src="https://g.alicdn.com/apsara-media-box/imp-web-queen-wasm/6.2.2/dist/js/aliyun-queen-engine.js"></script>
//Pro版:
<script src="https://g.alicdn.com/apsara-media-box/imp-web-queen-wasm/6.2.2/dist/js/aliyun-queen-engine-pro.js"></script>
//Full版:
<script src="https://g.alicdn.com/apsara-media-box/imp-web-queen-wasm/6.2.2/dist/js/aliyun-queen-engine-full.js"></script>
//Worker版本
<script src="https://g.alicdn.com/apsara-media-box/imp-web-queen-wasm/6.2.2/dist/js/aliyun-queen-engine-worker.js"></script>
微信小程序版接入
JS文件(https://g.alicdn.com/apsara-media-box/imp-web-queen-wasm/6.3.3/dist/js/aliyun-queen-engine-wx.js)和WASM文件(https://g.alicdn.com/apsara-media-box/imp-web-queen-wasm/6.3.3/dist/wasm/weixin/queen.wasm.bin)。
下载上述文件到微信小程序项目文件夹中,并将
queen.wasm.bin
改名为queen.wasm.br
。调用方式:
import QueenEngine, {kQueenBeautyType, kQueenBeautyMakeupType,kQueenBeautyBlend, kQueenBeautyParams} from '/assets/aliyun-queen-engine-wx' let canvas = await new Promise((resolve) => { wx.createSelectorQuery().select('#canvas1').fields({ node: true}).exec((res) => { resolve(res[0].node); })}); queenEngine = new QueenEngine(); queenEngine.setWasmUrl("/assets/")//queen.wasm.br文件目录 queenEngine.init("licenseKey", function(){ console.info("queen ready"); }, function(progress){ }, canvas);
canvas必须显式传入。
申请License试用时,需要提供微信AppId,以进行认证授权。申请License方式请参见获取美颜特效SDK License。
uni-app平台接入
如果您的项目是使用uni-app框架进行开发,可参考以下方式接入美颜特效SDK。
接入前请确保您的uni-app项目已支持TypeScript。
您需要安装美颜特效组件,具体操作可参见文档开头部分通过NPM导入Queen SDK。
声明容器
<template>
<view class="container" />
</template>
初始化组件
let queenEngine: any
const sdkLicenseKey = '*********' // queen sdk 授权licenseKey
async function init(){
const canvasContainer = document.querySelector('.container') as HTMLElement;
const canvas = document.createElement('canvas') as HTMLCanvasElement;
canvas.setAttribute('type', 'webgl2');
canvasContainer.appendChild(canvas);
const queenEngine = new QueenEngine();
queenEngine.init(sdkLicenseKey, function(){
//初始化完成回调
}, function(progress){
//progress:加载进展条
}, canvas);
}
//调用init()方法即进行组件初始化
接入美颜特效SDK需要License授权,您可根据您的uni-app项目最终打包的程序申请对应的License。申请License方式请参见获取美颜特效SDK License。
更多使用方法和说明可参见Queen Web SDK接入示例以及Queen Web SDK接口说明。
Queen Web SDK接入示例
初始化Queen引擎
初始化Queen引擎。
const sdkLicenseKey = ""; //queen sdk 授权licenseKey const queenEngine = new QueenEngine(); //const queenEngine = new QueenEnginePro(); //Pro版本初始化 queenEngine.init(sdkLicenseKey, function(){ //初始化完成回调 }, function(progress){ //progress:加载进度条 });
指定canvas初始化。
需要指定的
canvasElement type
为webgl2
类型或默认为空。const canvasElement = document.getElementById("canvas"); const queenEngine = new QueenEngine(); queenEngine.init(sdkLicenseKey, function(){ //初始化完成回调 }, function(progress){ //progress:加载进度条 }, canvasElement);
指定推理模型初始化。
const queenEngine = new QueenEnginePro(); queenEngine.init(sdkLicenseKey, function(){ //初始化完成回调 }, function(progress){ //progress:加载进度条 }, canvasElement,{ "segment": kQueenModelShapeType.None,//初始化时不加载背景抠图模型 "pose": kQueenModelShapeType.None, //初始化时不加载美体变形模型 "backend": kBackendType.Auto //自动选择推理后端 });
说明kQueenModelShapeType.None
默认不加载背景抠图模型,使用抠图或美体时按需加载。kQueenModelShapeType.Horizontal
引擎初始化时载入横向图模型。kQueenModelShapeType.Vertical
引擎初始化时载入竖向图模型。kQueenModelShapeType.Both
引擎初始化时载入时加载横向图模型和竖向图模型。横向图模型,即
width > height
源输入。竖向图模型,即
height > width
源输入。kBackendType.WebGL
使用WebGL推理后端。kBackendType.WebGPU
优先使用WebGPU推理后端。模型加载会影响页面加载速度。
Worker版本接入。
import {QueenEngineWorker, kQueenBeautyType, kQueenBeautyParams, kQueenBeautyMakeupType, kQueenBeautyFaceShapeType, kQueenBeautyBlend} from "aliyun-queen-engine" const canvasElement = document.getElementById("canvas"); queenEngine = new QueenEngineWorker(kQueenVersion.Pro); queenEngine.init(sdkLicenseKey, function(){ //初始化完成回调 }, function(progress){ //progress:加载进度条 }, canvasElement);
配置美颜参数
设置基础美颜。
// 开启基础美颜 queenEngine.setQueenBeautyType(kQueenBeautyType.SkinBuffing, true); // 设置磨皮系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.SkinBuffing, 0.7); // 设置锐化系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.Sharpen, 0.5); // 打开美白功能开关 queenEngine.setQueenBeautyType(kQueenBeautyType.SkinWhiting, true); // 设置美白系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.Whitening, 0.6); // 设置红润系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.SkinRed, 0.2);
设置高级美颜。
//高级美颜 queenEngine.setQueenBeautyType(kQueenBeautyType.FaceBuffing, true); // 设置去眼袋系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.Pouch, 0.9); // 设置去法令纹系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.NasolabialFolds, 0.9); // 设置白牙系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.WhiteTeeth, 0.9); // 设置口红系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.Lipstick, 0.2); // 设置腮红系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.Blush, 0.1); // 设置口红色相系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.LipstickColorParam, 0.1); // 设置口红饱和度系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.LipstickGlossParam, 0.1); // 设置口红明度系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.LipstickBrightnessParam, 0.1); // 设置亮眼系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.BrightenEye, 0.9); // 设置红润系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.SkinRed, 0.2); // 设置去皱纹系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.Wrinkles, 0.9); // 设置去暗沉系数 queenEngine.setQueenBeautyParams(kQueenBeautyParams.BrightenFace, 0.3);
设置美型。
// 打开美型功能开关,美型参数详见kQueenBeautyFaceShapeType queenEngine.setQueenBeautyType(kQueenBeautyType.FaceShape, true); //颧骨,值的范围[0,1],默认0 queenEngine.setFaceShape(kQueenBeautyFaceShapeType.CutCheek, 0.6); // 削脸,值的范围[0,1],默认0 queenEngine.setFaceShape(kQueenBeautyFaceShapeType.CutFace, 0.7); //瘦脸,值的范围[0,1],默认0 queenEngine.setFaceShape(kQueenBeautyFaceShapeType.ThinFace, 0.8); //脸长,值的范围[0,1],默认0 queenEngine.setFaceShape(kQueenBeautyFaceShapeType.LowerJaw, 0.8); //下巴拉长,值的范围[-1,1],默认0 queenEngine.setFaceShape(kQueenBeautyFaceShapeType.HigherJaw, 0.6);
设置美妆。
使用SDK内置资源美妆。
使用内置资源接口时,SDK会从CDN下载美颜素材。
//激活美妆 queenEngine.setQueenBeautyType(kQueenBeautyType.Makeup, true); //设置美妆眉毛 await queenEngine.setMakeupEyeBrow(Assets.kResMakeupEyeBrow.BiaoZhunMei, 0.6); //设置美妆睫毛 await queenEngine.setMackupEyeLash(Assets.kResMakeupEyeLash.ChenJing, 0.6); //设置美妆眼影 await queenEngine.setMakeupEyeShadow(Assets.kResMakeupEyeShadow.DaDiSe, 0.5); //设置美妆眼线 await queenEngine.setMakeupEyeLiner(Assets.kResMakeupEyeLiner.DaYan, 0.4); //设置美妆美瞳 await queenEngine.setMakeupEyeBall(Assets.kResMakeupEyeBall.BiMuYu, 0.5); //设置美妆口红 await queenEngine.setMakeupMouth(Assets.kResMakeupMouth.AnYeZi, 0.3); //设置美妆腮红 await queenEngine.setMakeupBlush(Assets.kResMakeupBlush.BlushWuGu, 0.2); //设置美妆高光 await queenEngine.setMakeupHighlight(Assets.kResMakeupHighLight.Highlight, 0.1); //移除美妆效果 - 移除美妆美瞳 queenEngine.removeMakeupWithType(kQueenBeautyMakeupType.Eyeball); //详细请参考QueenEngin.d.ts接口文件说明
本地资源美妆。
const makeupPackage = "./mouth.zip" const makeupName = "1.2.3.png"; const band = kQueenBeautyBlend.LabMix; // 打开美妆功能开关,美妆参数详见kQueenBeautyMakeupType queenEngine.setQueenBeautyType(kQueenBeautyType.Makeup, true); // 设置美妆口红效果的透明度 queenEngine.setMakeupAlphaWithType(kQueenBeautyMakeupType.Mouth, true, 0.6); // 设置口红效果 queenEngine.setMakeupWithPackage(kQueenBeautyMakeupType.Mouth, makeupPackage, makeupName, band).then(() => { });
设置滤镜。
使用内置滤镜。
await queenEngine.setLutByType(Assets.kResLut.M1, 0.5);
使用自定义滤镜。
const lutImageUrl = "./lut.png"; queenEngine.setLutImageUrl(lutImageUrl).then(function () { queenEngine.setQueenBeautyType(kQueenBeautyType.LUT, true); queenEngine.setQueenBeautyParams(kQueenBeautyParams.LUT, 0.5); });
设置头像贴纸。
使用内置贴纸。
queenEngine.addMaterialWithType(Assets.kResSticker.ILoveChina); //或 queenEngine.addMaterialWithIndex(0); //同时设置多个 queenEngine.addMaterialWithIndexs([0,1]);
使用自定义贴纸。
const stickerZip = "./sticker.zip"; queenEngine.addMaterialWithUrl(stickerZip).then(() => { });
配置实景抠图。
const backgroundUrl = "./bg.png"; queenEngine.setSegmentBackgroundUrl(backgroundUrl).then(() => { });
配置绿幕抠图。
const backgroundUrl = "./bg.png"; const isBlue = false;//是否蓝幕 queenEngine.setGreenScreenWithUrl(isBlue, backgroundUrl).then(() => { });
配置背景处理。
//背景模糊 queenEngine.enableBokehBackground(true); //背景透明 queenEngine.enableTransparentBackground(true);
美颜渲染
摄像头流渲染。
queenEngine.openCameraAndRender().then((stream=>{ const video = document.querySelector('video'); video.srcObject = stream; video.play(); }))
渲染到Canvas。
渲染的Canvas为初始化引擎时传入的Canvas。
const sourceVideo = document.querySelector('video'); queenEngine.renderMediaObjectToRenderCanvas(sourceVideo, sourceVideo.clientWidth, sourceVideo.clientHeight);
视频流渲染。
navigator.mediaDevices.getUserMedia(constraints) .then(mediaStream => { let renderMediaStream = queenEngine.renderMediaStream(mediaStream); const video = document.querySelector('video'); video.srcObject = renderMediaStream; video.play(); });
图片渲染。
fetch(图片地址) .then(buffer => buffer.blob()) .then(createImageBitmap) .then(img => { queenEngine.renderWithMediaObject(img, img.width, img.height, function(imageBufferData, imageWidth, imageHeight){ const canvas = document.getElementById('playCanvas'); //canvas画布 const ctx = canvas.getContext("2d"); const imageBuffer = new Uint8ClampedArray(imageBufferData); const imageData = new ImageData(imageBuffer, imageWidth, imageHeight); ctx.clearRect(0, 0, imageWidth, imageHeight); ctx.putImageData(imageData, 0, 0); }); });
纹理渲染。
const canvas = document.getElementById("sourceCanvas"); let outTexture = queenEngine.renderMediaObjectToTexture(canvas, canvas.width, canvas.height); queenEngine.drawOutTexture(outTexture);//纹理会绘制到初始化传入的canvas
纹理输入渲染。
let inputTexture = queenEngine.generateTextureId(); queenEngine.updateTexture(inputTexture, imageData); let outTexture = queenEngine.renderTextureId(inputTexture, width, height); queenEngine.drawOutTexture(outTexture)//纹理会绘制到初始化传入的canvas
管道流渲染。
const videoTrack = stream.getVideoTracks()[0]; const processor = new MediaStreamTrackProcessor({ track: videoTrack }); const readFrameStream = processor.readable; const generator = new MediaStreamTrackGenerator({ kind: 'video' }); let writeFrameStream = generator.writable; readFrameStream.pipeThrough(queenEngine.getTransformStream()).pipeTo(writeFrameStream);