最近在学小程序,在把当前画布指定区域的内容导出并生成图片保存到本地这个知识点上踩坑了。

  这里用到的方法是: wx.canvasToTempFilePath(),该方法作用是把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径。(详情 看文档

  这里先来分析一下这句话:导出当前画布指定区域的内容并生成图片 。这里以画一个矩形并将该矩形保存到本地相册为例。

  首先我们要做的是先在画布上画一个矩形,其次是利用 wx.canvasToTempFilePath()方法导出画布指定区域的内容,这里当然就是要保存这个矩形了,根据该方法返回的文件路径,然后可以使用wx.saveImageToPhotosAlbum()方法将图片保存到本地相册了。

  思路清晰了,现在可以着手实现了。

  index.wxml中画布代码如下:

  1. <button type="primary" bindtap="save">保存当前绘图</button>
  2. <canvas canvas-id="myCanvas" style="border: 1px solid" />

  

  画矩形代码如下(该代码放在save方法中):

  1. const ctx = wx.createCanvasContext('myCanvas')
  2. ctx.setFillStyle('red')
  3. ctx.fillRect(20, 20, 150, 100)
  4. ctx.draw()

  

  此时点击按钮调用save方法,出现的效果如下:

      

  

  现在要做的就是将这个红色矩形导出来并存放到本地相册。根据文档的提示:需要在 draw 回调里调用wx.canvasToTempFilePath()方法才能保证图片导出成功

  那么以上代码可以修改为这样(此部分代码存放在draw方法里):

  1. wx.canvasToTempFilePath({
  2. x: 20,
  3. y: 20,
  4. width: 150,
  5. height: 100,
  6. destWidth: 150,
  7. destHeight: 100,
  8. canvasId: 'myCanvas',
  9. success: function (res) {
  10. console.log(res.tempFilePath) // 返回图片路径
  11. }
  12. })

  

  这样就完了吗?并没有,上面只是导出了矩形并返回了图片路径而没有将图片存放到本地,要实现这一点,还需要调用wx.saveImageToPhotosAlbum()方法,根据返回的路径来保存该图片到本地。

  那么以上代码又可以更改为(此部分代码存放在draw方法里):

  1. wx.canvasToTempFilePath({
  2. x: 20,
  3. y: 20,
  4. width: 150,
  5. height: 100,
  6. destWidth: 150,
  7. destHeight: 100,
  8. canvasId: 'myCanvas',
  9. success: function (res) {
  10. wx.saveImageToPhotosAlbum({
  11. filePath: res.tempFilePath,
  12. })
  13. }
  14. })

  

  进行到这一步,效果基本上已经实现了,注意,是基本上,,,,这里还存在着一个小bug,那就是在第一次生成图片并保存的时候是一张相同大小但是却是透明的图片,并非是期望的红色矩形,而之后生成的就是红色的矩形图片了,只有第一次不是,这是为什么呢?仔细分析了下,可能原因是,第一次保存图片的时候,矩形可能并没有绘制完成,因而裁剪后保存的是一张相同大小但是透明的图片,于是我将上述代码稍微做了调整,给它加了一个定时器。

  

  1. const ctx = wx.createCanvasContext('myCanvas')
  2. ctx.setFillStyle('red')
  3. ctx.fillRect(20, 20, 150, 100)
  4. ctx.draw(true, setTimeout(function () {
  5. wx.canvasToTempFilePath({
  6. x: 20,
  7. y: 20,
  8. width: 150,
  9. height: 100,
  10. destWidth: 150,
  11. destHeight: 100,
  12. canvasId: 'myCanvas',
  13. success: function (res) {
  14. wx.saveImageToPhotosAlbum({
  15. filePath: res.tempFilePath,
  16. })
  17. }
  18. })
  19. },100))

  好了,现在bug已经解决了,每次都能实现预期的效果了。

  补充:最近开发小程序,使用了保存图片到本地,按照正常流程走发现是没有问题的,也就是说不存在第一次保存为空的情况,不需要再使用定时器来解决了。保存图片到本地需要授权问题:

  1. wx.saveImageToPhotosAlbum({
  2. filePath: downUrl, // 需要保存的图片地址
  3. success(res) {
  4. wx.showToast({
  5. title: '图片保存中...',
  6. icon: 'loading',
  7. duration: 1000
  8. });
  9. setTimeout(function () {
  10. wx.showToast({
  11. title: '图片保存成功',
  12. icon: 'success',
  13. duration: 2000
  14. })
  15. }, 1000)
  16.  
  17. },
  18. fail: function (res) {
  19. if (res.errMsg === "saveImageToPhotosAlbum:fail auth deny" || res.errMsg == "saveImageToPhotosAlbum:fail:auth denied" || res.errMsg == "saveImageToPhotosAlbum:fail authorize no response") {
  20. wx.showModal({
  21. title: '提示',
  22. content: '需要授权才可保存图片',
  23. showCancel: false,
  24. success(res) {
  25. if (res.confirm) {
  26. wx.openSetting({
  27. success(settingdata) {
  28. if (settingdata.authSetting["scope.writePhotosAlbum"]) {
  29. wx.showToast({
  30. title: '获取权限成功,再次点击可保存图片',
  31. icon: 'none',
  32. duration: 2000
  33. })
  34. } else {
  35. wx.showToast({
  36. title: '获取权限失败',
  37. icon: 'none',
  38. duration: 2000
  39. })
  40. }
  41. },
  42. fail() {
  43. wx.showToast({
  44. title: '获取权限失败',
  45. icon: 'none',
  46. duration: 2000
  47. })
  48. }
  49. })
  50. }
  51. }
  52. })
  53. }
  54. }
  55. })

微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)的更多相关文章

  1. 微信小程序折线图表折线图加区域图

    1.先来个效果图 这里我用的是插件@antv/f2-canvas(安装的方法如下) npm init 此处如果直接使用官方npm install 可能会出现没有node_modules错误 npm i ...

  2. 微信小程序到底把什么定义为风险内容?

    目录 起因 经过和结果 附录: 起因 之前做一个群相册的小程序,因为涉及到图片和评论等内容的发布分享.因此,微信后台要求有一定的内容安全检测能力. 但是,我用别家的内容检测用的好好的,在国庆前被微信警 ...

  3. 微信小程序页面滚动到指定位置

    页面上有一个元素或者组件,id 为 comment 则: var me = this; var query = wx.createSelectorQuery().in(me); query.selec ...

  4. 【微信小程序】--bindtap参数传递,配合wx.previewImage实现多张缩略图预览

    本文为原创随笔,纯属个人理解.如有错误,欢迎指出. 如需转载请注明出处 在微信小程序中预览图片分为 a.预览本地相册中的图片. b.预览某个wxml中的多张图片. 分析:实质其实是一样的.都是给wx. ...

  5. 微信小程序分享到朋友圈方法与技巧

    小程序提供onShareAppMessage 函数,此函数只支持分享给我微信朋友.小程序如何分享到朋友圈呢? 我提供的方法是,使用canvas绘制一张图片,并用wx.previewImage预览图片, ...

  6. 微信小程序导航:官方工具+精品教程+DEMO集合(1月7更新)

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug ...

  7. 当微信小程序遇到AR(三)

    当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习. 本课程需要一定的基础:微信开发者工具,JavaS ...

  8. 移动开发之【微信小程序】的原理与权限问题以及相关的简易教程

    这几天圈子里到处都在传播着这样一个东西,微信公众平台提供了一种新的开放能力,开发者可以快速开发一个小程序,取名曰:微信公众平台-小程序 据说取代移动开发安卓和苹果,那这个东东究竟是干吗用的?但很多人觉 ...

  9. 搭建微信小程序服务

    准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...

随机推荐

  1. react父转子

    父组件使用子组件,子组件绑定父组件数据 ,子组件用props使用父组件数据 import React, { Component } from 'react'; import logo from './ ...

  2. mysql only_full_group_by报错的问题(转)

    原文:https://www.cnblogs.com/jim2016/p/6322703.html 在mysql 工具 搜索或者插入数据时报下面错误: ERROR 1055 (42000): Expr ...

  3. go语言判断末尾不同的长字符串的方法

    判断两种末尾不同的长字符串,在使用正则表达式的基础上,进一步利用好字符串的方法,最后成功对问题进行解决. package utils import ( "io/ioutil" &q ...

  4. 使用vue,react,angular等框架和不使用框架使用jquery的优缺点

    jquery和vue react等框架有着本质上的区别,从jquery到vue.react 或者说是到mvvm的转变,是一个思想的转变,是将原有的直接操作dom的思想转变到操作数据上去. vue更关注 ...

  5. Kotlin零碎总结

    1.对于Kotlin的包方法其实对应Java而言是静态方法,如Entrance.kt文件的外部有fun main(...方法,那么编译成字节码后就是Java的Entrance类里有public sta ...

  6. uwsgi_read_timeout超时处理

    最近发现一服务器一个奇怪的现象: Django的视图函数在浏览器一个请求的情况下,竟然做了两个请求的函数处理.不可思议,找了几天也不知道为什么, 只发现只要用uwsgi_read_timeout之后, ...

  7. BUG 图片元素img下 高度超出 出现多余空白

    BUG 图片元素img下 高度超出 出现多余空白 1.将图片转换为块级对象 即,设置img为“display:block;”.   2.设置图片的垂直对齐方式 即设置图片的vertical-align ...

  8. XXX is not mapped

    这个问题绊了我两次跟头,作为一个3年多开发经验的人,甚是尴尬 java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntax ...

  9. hdu 5074 相邻数和最大dp

    http://acm.hdu.edu.cn/showproblem.php?pid=5074 给定一个序列 有些位数未知,给你所有两个数连续所得到的能量,问你怎么安排数字使得总能量最大 二维dp,dp ...

  10. JVM虚拟机---本地接口(我还不太会)

    转载http://www.newhua.com/2008/0328/33542_2.shtml Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Ja ...