开题

前几天接到个需求,长按图片保存到相册,该图片上有用户头像和昵称以及对应的二维码;那这就不能直接当作图片来操作了,要先把整体图片画出来;我当时用的是canvas。效果图如下:

canvas drawImage

用canvas画图主要使用dramImage API,不太清楚的同学可以区MDN看看:developer.mozilla.org/zh-CN/docs/…

主要是用到图片URL,相对于左上角的x,y坐标以及image在canvas上绘制的宽高。

开始画图

那我们开始行动了,先在html上写个canvas标签:

<canvascanvas-id="shareCanvas"class="canvas"bindlongpress="saveImg"catchtouchmove="true"style="height: {{canvasHeight + 'rpx'}};width: {{canvasWidth + 'rpx'}};">
</canvas>
复制代码

在微信小程序上画图先要把图片路径保存到本地,这里我们可以使用wx.getImageInfo或者wx.downloadFile将图片转为本地。考虑到我们要操作多个图片,这里对这些API进行封装:

getImageInfo(src) {return new Promise((resolve, reject) => {wx.getImageInfo({src,success: (res) => resolve(res),fail: (res) => reject(res)})});
}
复制代码

如果你要使用downloadFile也可以,封装方法和上面一样。 封装好了那么我们可以开始画图了,这里需要三张图片,对应的代码如下:

Promise.all([this.getImageInfo('https://cyt-resource.oss-cn-shanghai.aliyuncs.com/wximg/qrcode_bg.jpg'),this.getImageInfo(this.data.userInfo.avatarUrl),this.getImageInfo(this.data.qrCodeUrl)]).then((res) => {const ctx = wx.createCanvasContext('shareCanvas');ctx.drawImage(res[0].path, 0, 0, 图片宽度, 图片高度);ctx.fillStyle = 'rgb(168, 88, 126)'; // 字体颜色ctx.setFontSize(12); // 字体大小ctx.fillText(this.data.userInfo.nickname, 相对于左上角的x坐标, 相对于左上角的y坐标);ctx.drawImage(res[1].path, x坐标, y坐标, 宽, 高);ctx.drawImage(res[2].path, x, y, width, height);ctx.draw();this.setData({isDrawnImg: true});}).catch((e) => {});
复制代码

在这里要说个需要注意的坑,将图片保存到本地需要在小程序后台的downloadFile域名配置里配置好对应的域名,一个都不能落, 比如微信头像需要在downloadFile合法域名配置里加入https://wx.qlogo.cn; 另外需要提醒大家,在微信开发者工具里调试的话尽量不要开不校验合法域名那个选项,即

不然就会出现在调试模式下都是好的,但是真机不开调试就没有效果了。而且不好排查错误。

优化

由于canvas画图需要时间,那我们可以在等待时加个loading效果,在生成或者失败时隐藏loading,失败时还需要提示

wx.showLoading({title: '图片生成中...'
});
wx.hideLoading();
wx.showToast({title: '图片生成失败'
});
复制代码

保存图片到相册

这里使用canvasToTempFilePath API,代码如下:

saveImg () {wx.canvasToTempFilePath({canvasId: 'shareCanvas',success: (res) => {wx.saveImageToPhotosAlbum({filePath: res.tempFilePath,success: (res) => {wx.showToast({title: '保存成功'});},fail: (res) => {this.authorizeToWritePhotosAlbum();}})}})
},
复制代码

这里有个失败时候的操作,主要是因为取消授权后就不能使用了,这里要给个提示,让用户可以再次选择授权进行图片保存,方法如下:

// 授权保存图片至相册
authorizeToWritePhotosAlbum () {wx.showModal({title: '提示',content: '需要您授权保存相册',showCancel: false,success: (res) => {wx.openSetting({success: (res) => {if (settingdata.authSetting['scope.writePhotosAlbum']) {wx.showModal({title: '提示',content: '获取权限成功,再次点击图片即可保存',showCancel: false,});} else {wx.showModal({title: '提示',content: '获取权限失败,将无法保存到相册哦~',showCancel: false,});}}})}});
},
复制代码

至此,画图以及保存到相册的问题都有解决了。那么如果我们需要适配呢,图片需要自适应。在微信小程序我们可以使用rpx进行自适应:可以看看文档 developers.weixin.qq.com/miniprogram…

自适应

因为drawImage里面的单位都是px,且不能更改,那我们应该怎么进行自适应。可以根据设置的 设备屏幕/750*自己设置的自适应宽度(单位为rpx),比如设置宽度为600rpx,那么在drawImage里就是设备屏幕/750*600;要获取屏幕高度直接调用wx.getSystemInfo就行了,取返回结果的screenWidth;文字大小,小图片的x,y坐标都可以通过这个方法进行自适应。

结题

我当时主要是域名配置忘了,坑了自己,然后就是授权问题(关闭后无法保存,自己懵了,没考虑到);希望大家都能注意下,写的不好的地方希望大家提出来,一大早写的比较匆忙,?

微信小程序之canvas画图相关推荐

  1. 微信小程序用canvas画图并分享

    最近开始做微信小程序,有这样一个需求: 从列表页进入详情,在每一个详情页面去分享,分享出来的图片是带有当前详情数据的图片 如下图的列表: 分享出来的样子: 解决方案和思路:canvas画图生成图片 上 ...

  2. 微信小程序使用canvas画图并保存到手机相册踩坑总结

    接到个项目做微信小程序的,需要将手机中的页面保存到手机相册中,效果图如下 首先想到的就是利用canvas画图然后在保存到相册,看起来很简单网上也有很多例子,但都不完整,很多网友分享的都在半吊子工程,只 ...

  3. 微信小程序-基于canvas画画涂鸦

    代码地址如下: http://www.demodashi.com/demo/14461.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  4. html5绘制图形幸运大转盘,微信小程序利用canvas 绘制幸运大转盘功能

    小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码 Page({ /** * 页面的初始数据 */ data: { awardsConfig: {}, resta ...

  5. 解决了:微信小程序使用canvas绘制倒计时圆圈和数字居中的实现

    微信小程序使用canvas绘制倒计时圆圈和数字居中的实现 1.显示结果 2.过程: (1)wxml + css <!-- 每道题 --><view style="backg ...

  6. 微信小程序使用canvas绘制二维码实现跳转小程序

    开始接到这个需求的时候,我查阅文档获取小程序码 | 微信开放文档 发现两种途径 需要后端在服务器上调用接口拿到二维码,因为调用的 https://api.weixin.qq.com这个域名是不允许上白 ...

  7. 微信小程序利用canvas实现六边形蜘蛛图

    微信小程序利用canvas实现六边形蜘蛛图 发布时间:2018-01-24 14:30:29 1..wxml <canvas style="width: 200px; height: ...

  8. 微信小程序使用canvas绘制海报并保存本地相册

    在做微信小程序的时候,很多都会用到生成海报分享功能,刚好最近项目有这个需求,今天就发出来记录下 首先是使用canvas绘制一张海报,微信小程序的canvas有老版本和新版本我是用的是新版本 代码如下 ...

  9. 微信小程序使用canvas绘图并下载

    微信小程序使用canvas绘图并下载 实现的功能: canvas绘制页面 当前页面可下载 文字自动换行 实现的效果最终如下图所示: 在这里插入图片描述 实现步骤: 1.页面初始化获取屏幕尺寸 onLo ...

最新文章

  1. scrapy_redis使用
  2. java初学者的书中收获
  3. 凝思系统分辨率怎么看_机械液压系统的泄漏怎么办,液压系统基本知识,看完你就懂了...
  4. C# - 在foreach中删除元素
  5. [小故事大道理] -- GoodMorning,Sir!
  6. Codeforces Round #596 (Div. 2)(第三场)
  7. 三维重建9:点云图像的滤波方法小结
  8. bootstrap获取弹框数据_Bootstrap模态弹出框的实例教程
  9. JAVA判断数组最大值
  10. win10商店游戏存档修改
  11. 长时间耳鸣的危害你知道有多严重吗?
  12. WPF中播放GIF图片
  13. Elasticsearch X-Pack许可证过期解决办法
  14. 鸿湖万联与龙芯中科共建“芯片+操作系统”全自主产业生态链
  15. VSCode的LeetCode插件中国区账号密码登录错误
  16. 你知道怎么快速将Ps(EPS)格式图片转成png、jpg等格式吗
  17. 有效学习python
  18. 工程技术TOP期刊《Engineering》观点评述:基于脑电图的脑-机接口系统在实用化进程中面临的挑战...
  19. 西城微方案设计——电子秤PCBA蓝牙语音秤方案
  20. 编写轮播图Viewpager

热门文章

  1. 使用Runnable多线程接口进行龟兔赛跑比赛
  2. 32位PowerPC构架通用寄存器分析及总结三
  3. Android 热修复方案Tinker(三) Dex补丁加载
  4. 2021年金三银四Java面试宝典,横扫社招+春招+秋招!
  5. 上海交通大学船舶海洋与建筑工程学院谢彬Numerical TESTs for PDEs解答5.2.2
  6. photoshop中图片添加新的图片当的新的图层
  7. CR渲染器全景图如何渲染颜色通道_C4D中,什么是UV纹理以及如何展UV
  8. ssr提示服务器名无效_设备维保数据自动采集,为低效无效资产指标体系打基础...
  9. Linux命令screen
  10. python基础大纲