小诺先生
小诺先生
  • 发布:2026-01-29 17:30
  • 更新:2026-01-29 17:54
  • 阅读:22

关于uni.canvasToTempFilePath获取画布临时路径

分类:uni-app

在nvue页面,使用live-pusher拍照,拿到的图片添加水印,然后调用vue页面方法,执行合成水印,ctx.draw(true, () => {
执行到这里,就不执行了
uni.canvasToTempFilePath({
canvasId: 'myCanvas',
success: (res) => {
console.log(res.tempFilePath);
this.images.push(res.tempFilePath)
// uni.saveImageToPhotosAlbum({
// filePath: res.tempFilePath,
// success: function() {
// console.log('保存成功');
// }
// });
},
fail: console.error
});
}, this);
uni.canvasToTempFilePath获取不到临时路径,只有回到vue页面,点击按钮才执行

2026-01-29 17:30 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

该问题请在专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

您遇到的问题是:在 nvue 页面 中使用 live-pusher 拍照后,通过 canvas 添加水印,再调用 uni.canvasToTempFilePath 获取临时路径时,回调不执行,只有在回到 vue 页面点击按钮才触发。


✅ 问题根因

这是 nvue 页面中 canvas 绘制与导出图片的异步回调未触发 的典型问题,原因如下:

  • nvue 页面中,canvas 的绘制和导出操作(如 ctx.draw()uni.canvasToTempFilePath不会自动触发回调,因为 nvue 的渲染机制与 vue 页面不同,必须手动传入组件实例

✅ 正确做法(解决方案)

你需要在调用 uni.canvasToTempFilePath 时,显式传入当前组件实例(即 this),否则回调不会执行。

✅ 修改代码如下:

ctx.draw(true, () => {  
  uni.canvasToTempFilePath({  
    canvasId: 'myCanvas',  
    success: (res) => {  
      console.log('水印图片路径:', res.tempFilePath);  
      this.images.push(res.tempFilePath);  
    },  
    fail: (err) => {  
      console.error('canvasToTempFilePath 失败:', err);  
    }  
  }, this); // ✅ 关键:传入 this(当前组件实例)  
});

⚠️ 注意事项

  1. canvasId 必须和 <canvas> 标签的 canvas-id 完全一致
  2. canvas 必须在当前页面可见区域,否则导出可能失败。
  3. nvue 页面不支持 <canvas> 标签,你需要使用 <gcanvas><canvas> 组件(取决于平台),并确保使用的是 weex 的 canvas 模块
  4. 如果你使用的是 gcanvas,请改用 weex.requireModule('canvas') 的方式操作 canvas,而不是 uni.createCanvasContext

✅ 替代方案(如仍无效)

如果上述方法仍无效,建议你:

  • 将拍照后的图片路径传给 vue 页面,在 vue 页面中完成水印绘制和导出;
  • 或者使用 plus.nativeObj.Bitmap 进行图像处理(App 端可用);
  • 或者使用 renderjs 在 vue 页面中完成 canvas 操作(仅限 h5 和 app-vue)。

✅ 示例参考

你可以参考官方 demo 中的 nvue + live-pusher + canvas 实现方式:

? uni-live-test-demo - nvue 示例


如仍有问题,建议提供你使用的 canvas 标签类型(是 <canvas> 还是 <gcanvas>),以及平台(App-iOS、App-Android、鸿蒙?),我可以进一步帮你定位。

内容为 AI 生成,仅供参考
小诺先生

小诺先生 (作者)

ctx.draw(true, () => {
uni.canvasToTempFilePath({
canvasId: 'myCanvas',
success: (res) => {
console.log('水印图片路径:', res.tempFilePath);
this.images.push(res.tempFilePath);
},
fail: (err) => {
console.error('canvasToTempFilePath 失败:', err);
}
}, this); // ✅ 关键:传入 this(当前组件实例)
});依然无效,无法获取到合成后的临时地址

要回复问题请先登录注册