- 当前 Bug 的表现(可附上截图)
canvas 生成图片后,在image标签展示展示生成的图片在安卓大概率出现黑屏
图片的获取都成功了,将canvas 组件显示出来发现画的是没有问题的,但是获取的图片展示确实黑色的。获取图片的方法已经延时2s。
- 预期表现
- 复现路径
- 提供一个最简复现 Demo
var widthPercent = this.data.getSystemInfo.windowWidth / 375;
var that = this
let ctx = wx.createCanvasContext('ewmCanvas');
// 画背景图片
let bgimageurl = that.data.sharemsg.picInfo.picUrl
canvas.getImageInfo(bgimageurl, function (res) {
console.log("图片1",res)
// ctx.save()
ctx.drawImage(res.path, 0, 0, 345 * widthPercent, 255 * widthPercent)
// ctx.restore()
// 画头像
let iconimageUrl = that.userInfo.imageUrl
canvas.getImageInfo(iconimageUrl, function (res) {
console.log("图片2", res)
ctx.save()
ctx.arc(40 * widthPercent, 40 * widthPercent, 20, 0, Math.PI * 2, false);
ctx.clip();
ctx.drawImage(res.path, 20 * widthPercent, 20 * widthPercent, 40 * widthPercent, 40 * widthPercent)
ctx.restore()
// 设置昵称
ctx.save();
ctx.setFontSize(16 * widthPercent)
ctx.setFillStyle('rgb(255, 255, 255)')
ctx.fillText(that.userInfo.name, 70 * widthPercent, 46 * widthPercent)
ctx.restore()
// 设置文字标题
ctx.save();
ctx.setFontSize(28 * widthPercent)
ctx.setTextAlign('center')
ctx.setFillStyle('rgb(255, 255, 255)')
ctx.setShadow(1, 1, 3, 'rgba(0, 0, 0, 0.2)')
ctx.fillText(that.data.sharemsg.picInfo.title, 172.5 * widthPercent, 235 * widthPercent)
ctx.restore()
//设置底部白色背景
ctx.save();
ctx.beginPath()
ctx.rect(0, 255 * widthPercent, 345 * widthPercent, 90 * widthPercent)
ctx.setFillStyle('#ffffff')
ctx.fill()
ctx.restore()
// 设置二维码
var ewmImageUrl = that.data.sharemsg.picInfo.codeUrl
canvas.getImageInfo(ewmImageUrl, function (res) {
console.log("图片3", res)
// ctx.save()
ctx.drawImage(res.path, 10 * widthPercent, 260 * widthPercent, 80 * widthPercent, 80 * widthPercent)
// ctx.restore()
//设置顶部说明
ctx.save()
ctx.font = 'normal bold 18px sans-serif';
ctx.setFontSize(18 * widthPercent)
ctx.setFillStyle('rgb(51, 51, 51)')
// ctx.setTextAlign('center')
ctx.fillText(that.data.sharemsg.picInfo.codeTitle, 98 * widthPercent, 294 * widthPercent)
ctx.restore()
// 底部说明
ctx.setFontSize(16 * widthPercent)
ctx.setFillStyle('rgb(102, 102, 102)')
ctx.fillText(that.data.sharemsg.picInfo.codeSubTitle, 98 * widthPercent, 322 * widthPercent)
ctx.draw(false,function(){
setTimeout(function(){
canvas.canvasToTempFilePath('jpg', 'ewmCanvas', function (res) {
wx.hideToast()
var url = res.tempFilePath;
if (that.data.shareimageUrl == "set") {
that.data.sharemsg.show = true
that.setData({
sharemsg: that.data.sharemsg,
shareimageUrl: url,
})
} else {
that.setData({
shareimageUrl: url,
})
}
})
},2000)
})
},function(res){
that.data.shareimageUrl == ""
})
}, function (res) {
that.data.shareimageUrl == ""
});
}, function (res) {
that.data.shareimageUrl == ""
});
遇到同样的问题,目前的解决方案是在所有的绘制之前,先给画布上填充自己想要的颜色,再进行后续操作。canvasToTempFilePath的时候做个延迟。导出jpg格式
我这是在安卓手机上生成的图片放在image中都是白色的(不知道是不是透明的),在开发工具中部分图片导出的是可以显示,还有部分的也是像安卓中是白色或透明,难道这和图片有关系?
我们在开发中也有遇到这个问题,解决方法是在每次ctx.save()之前都把包括ctx.save()和接下来的所有步骤全部放入setTimeout内,并且延迟500毫秒。
我用的echarts的地图,在canvas转img时也碰到了这个问题。但是ctx.save()是echarts封装好的,我只能把ctx.draw()以及之后的操作放在延迟里,但安卓机还是大概率黑屏。请问大神知道怎么解决吗?
demo的例子是https://developers.weixin.qq.com/s/uFp3vjmM7s4J,唯一的不同是我使用的图片是网络的,这个因为账号原因放在了本地,网络图片用的canvas.js 中的getImageInfo方法获取,其他的都是一样的。这个在安卓机器上都会出现黑图。
提供一下出现问题的机型和微信版本,以及能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。
截至目前还未解决,安卓还会复现