canvas画图简单的流程就是:创建画布->在画布中画图->从可见画布生成图片->保存图片到客户端设备的相册中。其中画布转图片,微信小程序提供一个名为wx.canvasToTempFilePath,该API的参数如下:
其中一个重要的api是 wx.canvasToTempFilePath,这个api的作用是 把当前画布指定区域的内容导出生成指定大小的图片。在 draw()
回调里调用该方法才能保证图片导出成功。
其主要参数是如下:
然而,在讨论组中经常看到一个问题,那就是canvas生成的图片保存后很模糊,包括我自己第一次按照官方文档写demo的时候也遇到过。现在在网上搜索这个的问题的内容,出现最多的就是两个方案,而且很多内容都是复制已有文章内容的。
方案一:方案1准备两个canvas,一个绘制压缩图(600*400),一个绘制原图大小(1200*800),截图的时候从原图canvas截取。
但实际上上这个方案有一点问题:其一,生成需要两个画布;其二,绘制过大画布在安卓上面会出现问题,官方文档里也提示了避免设置过大的宽高,在安卓下会有crash的问题。
方案二:将canvas大小设为(1200*800),使用css将canvas缩放到适应屏幕大小。(此步骤可省略,直接设置destWidth和destHeight乘以像素比即可)
这在开发工具的模拟器中是没有问题的,然而在真机测试的时候是无效的,不管用的是transform还是zoom。
本质上就是生成一个更大的图片,因为手机的屏幕设备的像素比现在一般都是超过2的。实际上我们只需要在使用wx.canvasToTempFilePath的时候,设置参数destWidth和destHeight(输出的宽度和高度)为width和height的2倍以上即可,一般设置为屏幕像素密度比较好,可以wx.getSystemInfo这个API来获取设备的像素比了(pixelRatio)。但是仔细看destWidth和destHeight的参数说明,我们其实压根不需要设置这个参数,因为它默认的就是取的width乘以屏幕像素密度。
另外你还可以设置下图片格式为jpg,因为图片的质量,目前仅对 jpg 有效。将quality的值设置为1试试。
我项目里,我是这样设置的,手机导出的图片上的文字非常的清晰:
// 生成图片 ctx.draw(true, function () { // return false wx.canvasToTempFilePath({ canvasId: mycanvasid, x: offsetx, y: offsety, fileType,// 设为jpg quality, // 1 width: width,// 750 height: height, // 1330 // destWidth: destWidth, // 很多教程说这个设置为width的2倍,其实用默认值就好了,不用设置 // destHeight: destHeight, success: function (res) { // 回调 返回临时的图片地址 callback(res.tempFilePath) }, fail: function () { // 导出图片错误 wx.showModal({ title: '导出图片时出错', content: '请重新尝试!', }) }, complete: function () { wx.hideLoading() } }, this) })
最近学了阿里资深技术专家出的一个MySQL高级实战教程,感觉不错,分享给大家。
联系客服