uni-app canvasToTempFilePath使用uni小程序时fail提示canvas is empty,而wx小程序则正常
uni-app canvasToTempFilePath使用uni小程序时fail提示canvas is empty,而wx小程序则正常
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 10 | HBuilderX |
## 示例代码:
```javascript
uni.canvasToTempFilePath({
canvasId:this.id,
success:(e)=>{
console.log(e)
},
fail:(e)=>{
console.log(e)
}
},this)
操作步骤:
uni.canvasToTempFilePath({
canvasId:this.id,
success:(e)=>{
console.log(e)
},
fail:(e)=>{
console.log(e)
}
},this)
预期结果:
返回正常
实际结果:
fail canvas is empty
bug描述:
编译到微信小程序
vue3 在组件中使用 uni.canvasToTempFilePath 时,报错 fail: canvas is empty
同样情况下直接使用 wx.canvasToTempFilePath ,符合预期
Releases v3.2.12 Alpha v3.2.14,这两个版本都有同样问题
相关链接:
更多关于uni-app canvasToTempFilePath使用uni小程序时fail提示canvas is empty,而wx小程序则正常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
canvas-id是否存在? 注意:同一页面中的 canvas-id 不可重复,如果使用一个已经出现过的 canvas-id,该 canvas 标签对应的画布将被隐藏并不再正常工作。
更多关于uni-app canvasToTempFilePath使用uni小程序时fail提示canvas is empty,而wx小程序则正常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
存在的,而且只有一个canvas,所在行如下: <canvas @longpress=“lp” :canvas-id=“id” :id=“id”/ >
回复 c***@163.com: 是微信小程序吗?可提供一个简单可复现的示例(上传附件),方便我们排查哦
回复 DCloud_UNI_Anne: 附件已添加,问题也找到了是vue3+组件会出现,非组件或者非vue3不会出现
问题已确认,后续优化,已加分,感谢您的反馈!
请问何时优化完成
//昨晚也碰到这个 canvas is empty 的问题,读到某篇文章后解决的。希望能帮到后面的人
//以下是代码
const context = uni.createCanvasContext(‘canvas1’, this);
var picBGUrl = ‘http://…’;
uni.getImageInfo({
src: picBGUrl,
success: function(res) {
//背景
context.drawImage(res.path,0,0,300,400);
context.save();
//写字
context.setFontSize(16);
context.setFillStyle("#111111");
context.fillText(‘write words’,58,107);
context.save();
//这边是关键!!!
context.draw(true,()=>{
uni.canvasToTempFilePath({
canvasId: ‘canvas1’,
success: function(res) {
_this.tempImg = res.tempFilePath;
console.log(“Canvas:”+res.tempFilePath)
},
fail: function(res) {
console.log(“fail!!!”+JSON.stringify(res));
}
});
});
}
});
太对了老哥,ctx.draw(true,()=>{ })这个是关键
alpha 3.3.0 已修复
遇到同样的问题
这个问题是由于uni-app在微信小程序平台上的canvas组件渲染时机差异导致的。在uni-app中,canvas的渲染可能比原生微信小程序稍晚,导致调用canvasToTempFilePath时canvas内容尚未绘制完成。
解决方案:
- 使用setTimeout延迟执行(推荐):
setTimeout(() => {
uni.canvasToTempFilePath({
canvasId: this.id,
success: (e) => {
console.log(e)
},
fail: (e) => {
console.log(e)
}
}, this)
}, 300) // 适当延迟,确保canvas已渲染
- 在canvas绘制完成后调用:
确保在canvas的
@ready事件触发后再调用转换方法:
<canvas :canvas-id="id" @ready="onCanvasReady"></canvas>
onCanvasReady() {
// 在这里执行canvas绘制操作
// 绘制完成后再调用canvasToTempFilePath
uni.canvasToTempFilePath({
canvasId: this.id,
success: (e) => {
console.log(e)
}
}, this)
}
- 使用Promise封装:
const canvasToImage = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
uni.canvasToTempFilePath({
canvasId: this.id,
success: resolve,
fail: reject
}, this)
}, 300)
})
}


