wx.canvasToTempFilePath众所周知,微信canvas生成图片需要调用这个接口,而这个接口想要生成高清图片,解决字体模糊问题,需要destWidth*dpr。原始canvas的宽高太大,再加上destWidth*dpr必然会导致destWidth的宽高太大,可能导致Android在生成图片的时候失败。由于这个接口不起作用,所以不要使用这个接口。换个思路,小程序canvastype=2d接口支持更全面的基础库。按照官方的介绍,canvastype=2d基本就是指H5界面。那么,H5中可用的方法在这里应该也可用。.canvas2d根据微信提供的例子:Page({onReady(){constquery=wx.createSelectorQuery()query.select('#myCanvas').fields({node:true,size:true}).exec((res)=>{constcanvas=res[0].nodeconstctx=canvas.getContext('2d')constdpr=wx.getSystemInfoSync().pixelRatiocanvas.width=res[0].width*dpr画布。height=res[0].height*dprctx.scale(dpr,dpr)ctx.fillRect(0,0,100,100)})}})Canvas2d如果要画高清晰度,文字不模糊,你需要设置画布。width和canvas.height显式设置并乘以dpr(wxss也应该设置正常的宽高),绘图上下文ctx需要通过dpr进行缩放。Ctx缩放dpr以保持绘图密度与像素密度一致。如果某些东西不想缩放绘图,您可以设置ctx.setTransform(1,0,0,1,0,0)来恢复绘图上下文的缩放。现在我们大胆的画,因为画的密度等于像素的密度,所以实际显示的很清楚。canvas2d的宽高可以设置大一点,但不能太大。如果宽高过大,在Android下会出现crash的问题。真机测试1500800的宽高完全没有问题。由于像素密度的原因,如果dpr=3,实际上是45002400。那么这么大的宽高可能会导致Android真机在使用wx.canvasToTempFilePath时无法生成图片,这时候要牺牲一个神器:_canvas_.toDataURL(_type_,_encoderOptions_);HTMLCanvasElement.toDataURL()方法返回包含图片显示的数据URI。其类型可以使用type参数,默认为PNG格式。图片的分辨率为96dpi。type可选,图片格式,默认为image/pngencoderOptions可选,当指定图片格式为image/jpeg或image/webp时,可以选择图片的质量,从0到1。如果超出取值范围,则将使用默认值0.92。其他参数被忽略。通过canvas.toDataURL()可以得到一个带有图片展示的dataURI,删除headerdata:image/jpeg;base64得到一个纯base64的图片数据。既然已经获取了图片数据,接下来就可以将数据写入一张图片了。打开微信提供的文件管理器将base64数据转换成buffer,通过fsm.writeFile将文件写入到用户存储空间的wx.env.USER_DATA_PATH位置。文件路径是图片。由于微信的存储空间只有10M,最大支持生成10M的图片,可以满足大部分需求。constfilePath=`${wx.env.USER_DATA_PATH}/cover.jpg`;letfsm=wx.getFileSystemManager();letbuffer=wx.base64ToArrayBuffer(bodyData);fsm.writeFile({filePath:filePath,data:buffer,编码:'binary',success(){console.log('---success---',filePath);},fail(error){console.error(error);}});别忘了用它来清理存储空间,不然下次就没法保存了removeLocalFile(){//注意文件存储空间是10M//为了保留足够的空间,删除根目录下的文件constfsm=wx.getFileSystemManager();尝试{constls=fsm.readdirSync(wx.env.USER_DATA_PATH);ls.forEach(d=>{letpath=`${wx.env.USER_DATA_PATH}/${d}`;letstats=fsm.statSync(path);if(stats.isFile()){fsm.unlinkSync(小路);}});}catch(e){console.log(e);可以根据需要清除不同的文件,不需要清除根目录下的所有内容至此,就可以愉快的使用canvas2d绘制高清图片了。
