uni-app 3.0.7.20210123 HbuilderX canvas 保存的是空白图片
uni-app 3.0.7.20210123 HbuilderX canvas 保存的是空白图片
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 20H2 19042.746 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:20H2 19042.746
HBuilderX类型:正式
HBuilderX版本号:3.0.7
手机系统:Android
手机系统版本号:Android 10
手机厂商:小米
手机机型:redmik30 pro
页面类型:vue
打包方式:云端
项目创建方式:HBuilderX
示例代码:
post() {
var that = this
uni.showLoading({
title: '保存中'
});
const context = uni.createCanvasContext('firstCanvas')
context.drawImage('http://xxxx.com/xxx.png',0, 0, 375, 473) //这是背景图片
context.drawImage(that.img, 87.5, 150, 200, 200) //这是二维码
context.save()
context.beginPath()
context.arc(44, 350, 25, 0, 2 * Math.PI)
context.clip()
context.restore()
context.draw()
setTimeout(function(){
uni.canvasToTempFilePath({
x: 0,
y: 0,
// width: 375,
// height: 473,
// destWidth: 700,
// destHeight: 1000,
canvasId: 'firstCanvas',
success: function(res) {
console.log(res.tempFilePath)
uni.hideLoading()
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: function(red) {
uni.showToast({
title: '保存相册成功'
})
},
fail(res) {
console.log(res)
if (res.errMsg == "saveImageToPhotosAlbum:fail auth deny") {
uni.showModal({
title: '您需要授权相册权限',
success(res) {
if (res.confirm) {
uni.openSetting({
success(res) {
},
fail(res) {
console.log(res)
}
})
}
}
})
}
}
});
},
fail(res) {
uni.hideLoading()
}
}, this)
},4000)
}
操作步骤:
详见上面的示例
context.drawImage('http://xxxx.com/xxx.png',0, 0, 375, 473)
context.drawImage(that.img, 87.5, 150, 200, 200)
context.save()
context.beginPath()
context.arc(44, 350, 25, 0, 2 * Math.PI)
context.clip()
context.restore()
context.draw()
uni.canvasToTempFilePath({canvasId: 'firstCanvas',})
预期结果:
用canvasToTempFilePath 保存 canvas绘制的图片,保存到相册,应该正常显示才对
实际结果:
用canvasToTempFilePath 保存 canvas绘制的图片,保存到相册,保存到相册是空白的
## bug描述:
最新的hbuilderX, 版本号是:3.0.7.20210123
打包出来的app, canvas 绘制图片,保存的图片是空白的
更多关于uni-app 3.0.7.20210123 HbuilderX canvas 保存的是空白图片的实战教程也可以访问 https://www.itying.com/category-93-b0.html
试试最新版是否正常
更多关于uni-app 3.0.7.20210123 HbuilderX canvas 保存的是空白图片的实战教程也可以访问 https://www.itying.com/category-93-b0.html
新版已经ok了,新版本中ok的 请关注一下这个问题:https://ask.dcloud.net.cn/question/110858
回复 3***@qq.com: 收到
这是一个常见的uni-app canvas保存空白图片的问题,主要原因是绘制和保存的时序问题。以下是解决方案:
- 确保所有图片资源加载完成后再绘制:
post() {
var that = this
uni.showLoading({
title: '保存中'
});
// 先预加载所有图片
Promise.all([
new Promise(resolve => {
const img = new Image()
img.src = 'http://xxxx.com/xxx.png'
img.onload = resolve
}),
new Promise(resolve => {
const img = new Image()
img.src = that.img
img.onload = resolve
})
]).then(() => {
const context = uni.createCanvasContext('firstCanvas')
context.drawImage('http://xxxx.com/xxx.png',0, 0, 375, 473)
context.drawImage(that.img, 87.5, 150, 200, 200)
// 移除不必要的save/restore
context.beginPath()
context.arc(44, 350, 25, 0, 2 * Math.PI)
context.clip()
// 使用回调确保绘制完成
context.draw(false, () => {
uni.canvasToTempFilePath({
canvasId: 'firstCanvas',
success: function(res) {
uni.hideLoading()
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: function() {
uni.showToast({title: '保存相册成功'})
},
fail(res) {
if (res.errMsg == "saveImageToPhotosAlbum:fail auth deny") {
uni.showModal({
title: '您需要授权相册权限',
success(res) {
if (res.confirm) {
uni.openSetting()
}
}
})
}
}
});
},
fail(res) {
uni.hideLoading()
console.error('保存失败', res)
}
}, this)
})
})
}