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

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

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

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

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

  index.wxml中画布代码如下:

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

  

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

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

  

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

      

  

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

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

wx.canvasToTempFilePath({
x: 20,
y: 20,
width: 150,
height: 100,
destWidth: 150,
destHeight: 100,
canvasId: 'myCanvas',
success: function (res) {
console.log(res.tempFilePath) // 返回图片路径
}
})

  

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

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

wx.canvasToTempFilePath({
x: 20,
y: 20,
width: 150,
height: 100,
destWidth: 150,
destHeight: 100,
canvasId: 'myCanvas',
success: function (res) {
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
})
}
})

  

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

  

const ctx = wx.createCanvasContext('myCanvas')
ctx.setFillStyle('red')
ctx.fillRect(20, 20, 150, 100)
ctx.draw(true, setTimeout(function () {
wx.canvasToTempFilePath({
x: 20,
y: 20,
width: 150,
height: 100,
destWidth: 150,
destHeight: 100,
canvasId: 'myCanvas',
success: function (res) {
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
})
}
})
},100))

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

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

wx.saveImageToPhotosAlbum({
filePath: downUrl, // 需要保存的图片地址
success(res) {
wx.showToast({
title: '图片保存中...',
icon: 'loading',
duration: 1000
});
setTimeout(function () {
wx.showToast({
title: '图片保存成功',
icon: 'success',
duration: 2000
})
}, 1000) },
fail: function (res) {
if (res.errMsg === "saveImageToPhotosAlbum:fail auth deny" || res.errMsg == "saveImageToPhotosAlbum:fail:auth denied" || res.errMsg == "saveImageToPhotosAlbum:fail authorize no response") {
wx.showModal({
title: '提示',
content: '需要授权才可保存图片',
showCancel: false,
success(res) {
if (res.confirm) {
wx.openSetting({
success(settingdata) {
if (settingdata.authSetting["scope.writePhotosAlbum"]) {
wx.showToast({
title: '获取权限成功,再次点击可保存图片',
icon: 'none',
duration: 2000
})
} else {
wx.showToast({
title: '获取权限失败',
icon: 'none',
duration: 2000
})
}
},
fail() {
wx.showToast({
title: '获取权限失败',
icon: 'none',
duration: 2000
})
}
})
}
}
})
}
}
})

微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(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. fabric 安装

    fabric 是一个python的库,fabric可以通过ssh批量管理服务器. 第一步安装依赖包 安装fabric依赖及pip yum install -y python-pip gcc pytho ...

  2. shell for if

    #!/bin/bash ..} do ];then j="${i}" else j="${i}" fi echo $j >> venn.log ec ...

  3. 半透明全屏蒙层+全屏屏蔽+内容居中+css

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 证明2x2正交矩阵专置后还是正交矩阵

    [ x1  x2 y1   y2] x1^2+y1^2=1 x2^2 + y2^2=1 x1*x2  + y1*y2=0 如果专置后还是 x1^2 + x2^2=1 y1^2  +y2^2=1 x1* ...

  5. MySQL API函数

    MySQL提供了很多函数来对数据库进行操作,大致可以分为以下几类:        第一部分 控制类函数         mysql_init()初始化MySQL对象    mysql_options( ...

  6. 5-具体学习git--分支冲突,merge合并

    修改1.py: 然后提交修改: git commit -am "change 4 in master" 之后移到dev分支上: 哎呀,这个乱了. 人家意思是都基于c1分出来两个枝, ...

  7. idea的maven项目不知道为啥下载不下来jar包,看本地仓库只是下载了一下xml文件,没有jar包问题

    确认了私服上的jar包能直接下载下来,而且jar包是正常的:但是就是不能通过idea下载,通过idea下载到本地仓库的只生成了.lastUpdated文件,检查了setting.xml文件.网络,私服 ...

  8. MFCC

    在语音识别研究领域,音频特征的选择至关重要.在这里介绍一种非常成功的音频特征——Mel Frequency Cepstrum Coefficient(MFCC),中文名字为梅尔频率倒谱系数.MFCC特 ...

  9. Java学习第1天:序言,基础及配置tomcat

    所谓是福不是祸,是祸躲不过,到底还是回到java的阵地上来.既然它这么热,那就学学它,现在这件事已经提上议事日程,也已经开始. 今天做的事: 泛泛的翻了几本书,敲了一些练习代码,比如字符串操作,接口等 ...

  10. js基础学习笔记(二)

    2.1  输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出&q ...