用了各种方法想把从后台拿到的小程序二维码图片保存到手机上面,就是不行
var src = "data:image/png;base64," + this.data.imageCode;
canvas.drawImage(src, 0, 0, 300, 300)
canvas.draw();
这样能画到canvas,但是把canvas保存成临时文件,再把这临时文件保存到相册的时候就不行,总是空的,但是我再说上面画text的时候,保存是好使的,就是用上面的那种方法画上去的二维码不行T.T
canvas.setFontSize(20)
canvas.fillText('asdfasdfasdfasdfas', 20, 20)
canvas.draw();
这样画上去的text是能出现的
模拟器上的canvas可以画base64的图片,但是真机上不行,估计是小程序的一个bug
你解决了没
var imgBaseData = '你的base64图片';
const fsm = wx.getFileSystemManager();
const FILE_BASE_NAME = 'tmp_base64src';
let pro2 = new Promise((resolve, reject) => {
const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(imgBaseData) || [];
if (!format) {
reject(new Error('ERROR_BASE64SRC_PARSE'));
}
const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
const buffer = wx.base64ToArrayBuffer(bodyData);
fsm.writeFile({
filePath,
data: buffer,
encoding: 'binary',
success() {
resolve(filePath);
},
fail() {
reject(new Error('ERROR_BASE64SRC_WRITE'));
},
});
});
pro2.then(data =>{
console.log(data);
//画图
canvas.drawImage(data, 0, 0, 300, 300) //data即是图片路径
})
@一个人走 我也是,在web直接返的base64,不知道你解决没有
我现在是把从内嵌网页的图片用base64传回来,但是转码出来没有图片,直接是黑色的。
canvas真的可以保存base64吗?空格和换行在哪里去掉???
drawText快啊,绘制个文本,绘制图片肯定效率不如绘制文字啊,形状啊(不过真机可以的话就以真机为准,工具上的canvas和真机上的方式应该不同) setTimeOut js的延迟方法
我刚真机测试了下,在iPhone下,同样的代码,一次就能直接保存成功,但是模拟器,就要像我刚说的要画两次并且保存两次😂
刚学小程序没俩星期😂,我之前也想可能是没画完的问题,但是不知道怎么加延迟,之后我发现:drawText就可以直接一次就画进去并且保存出来,所以可能不是延迟问题,
而且我的drawText是写在drawImage下面的,在模拟器上面字就是会被图片盖住😂,真机上面就是正常的。感觉这个canvas有点问题😂。
你绘制完立刻保存的嘛?如果是的话,保存适当加几百毫秒的延迟
恩,我已经把后台逻辑改成返回url了,之前是返回base64。
发现微信提供的api没有能将base64转成图片保存到本地的。
然后又出现一个新的问题,不知道是不是canvas的原因
我已经从服务器把图片用downFile下载下来,并且拿到tampFilePath了,
但是当我往canvas上面画并且保存的时候,第一次就总是保存的是空的图片,然后紧接着再画再保存,保存的图片就有了,每次程序运行都是这样,是我canvas的用法有问题吗?😂
恩 你图片不是从后端读取的嘛 采用wx.downFile的方式读取图片的网络路径,会返回你一个图片的临时路径