canvas2d 绘制分享海报,图片有先加载成功再绘制,其中用到了clip进行头像圆形切割,不断加载有时候会显示空白,显示空白时圆形切割有时候有效(显示成功切割的圆形头像)有时候无效(显示四方形原头像),加载显示正常时圆形切割则正常,怎么解决?
测试工具:微信开发者工具,真机测试都会出现这个问题
版本库:2.11(最新)
// 绘制背景图片
let background_img = await this.background_img;
const bgImage = canvas.createImage();
bgImage.src = background_img;
bgImage.onload = async()=>{
await context.drawImage(bgImage, 0, 0, bgImage.width*dpr, bgImage.height*dpr, 0, 0, canvas.width, canvas.height*0.8);
};
// 二维码
let share_code_img = await this.share_code_img;
const shareImage = canvas.createImage();
shareImage.src = share_code_img;
shareImage.onload = ()=>{
context.drawImage(shareImage, 0, 0, shareImage.width*dpr,shareImage.height*dpr, canvas.width/dpr-canvas.height/dpr*0.14, canvas.height/dpr*0.81, canvas.height*0.12,canvas.height*0.12);
};
context.save();
// 头像
context.beginPath(); //开始创建一个路径
let radius = canvas.height/dpr*0.12/2;
context.arc(radius*3/2,canvas.height/dpr*0.9, radius, 2 * Math.PI, false); //画一个圆形裁剪区域
context.stroke();
context.clip();
let headicon_img = await this.headicon_img;
const headImage = canvas.createImage();
headImage.src = headicon_img;
headImage.onload = ()=>{
context.drawImage(headImage, 0, 0, headImage.width*dpr,headImage.height*dpr,radius/2,canvas.height/dpr*0.9-radius,radius*2*dpr,radius*2*dpr);
};
context.restore();
问题已经解决,感谢大哥提醒,在原来的代码中,画头像环节需要进行save,clip,restore这个顺序的裁剪操作,这个顺序一定不能乱,但是在多个图片异步绘画的情况下如果裁剪不进行异步处理往往就会出现裁剪顺序错乱,这个在每次绘画的地方打一下log就能看出来,解决方法时把裁剪部分与需要裁剪的头像一起进行异步处理,就能保证每次绘画不能缺失。
初步看了你的代码,图片对象的创建回调函数是异步的,极有可能 content.restore() 会执行在图片回调之前导致 cilp 失效