微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)
最近在学小程序,在把当前画布指定区域的内容导出并生成图片保存到本地这个知识点上踩坑了。
这里用到的方法是: 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.先来个效果图 这里我用的是插件@antv/f2-canvas(安装的方法如下) npm init 此处如果直接使用官方npm install 可能会出现没有node_modules错误 npm i ...
- 微信小程序到底把什么定义为风险内容?
目录 起因 经过和结果 附录: 起因 之前做一个群相册的小程序,因为涉及到图片和评论等内容的发布分享.因此,微信后台要求有一定的内容安全检测能力. 但是,我用别家的内容检测用的好好的,在国庆前被微信警 ...
- 微信小程序页面滚动到指定位置
页面上有一个元素或者组件,id 为 comment 则: var me = this; var query = wx.createSelectorQuery().in(me); query.selec ...
- 【微信小程序】--bindtap参数传递,配合wx.previewImage实现多张缩略图预览
本文为原创随笔,纯属个人理解.如有错误,欢迎指出. 如需转载请注明出处 在微信小程序中预览图片分为 a.预览本地相册中的图片. b.预览某个wxml中的多张图片. 分析:实质其实是一样的.都是给wx. ...
- 微信小程序分享到朋友圈方法与技巧
小程序提供onShareAppMessage 函数,此函数只支持分享给我微信朋友.小程序如何分享到朋友圈呢? 我提供的方法是,使用canvas绘制一张图片,并用wx.previewImage预览图片, ...
- 微信小程序导航:官方工具+精品教程+DEMO集合(1月7更新)
1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug ...
- 当微信小程序遇到AR(三)
当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习. 本课程需要一定的基础:微信开发者工具,JavaS ...
- 移动开发之【微信小程序】的原理与权限问题以及相关的简易教程
这几天圈子里到处都在传播着这样一个东西,微信公众平台提供了一种新的开放能力,开发者可以快速开发一个小程序,取名曰:微信公众平台-小程序 据说取代移动开发安卓和苹果,那这个东东究竟是干吗用的?但很多人觉 ...
- 搭建微信小程序服务
准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...
随机推荐
- vsftpd只能连接不能上传文件问题
Centos7 记得很清楚,vsftpd安装后,不需要配置,本地用户就可以正常使用(登录.上传.下载) 这次配的就是不行,另起了个虚拟机,装了下,就是不需要配置,但是在一台机上,就是不行,只能登录,下 ...
- 2018.11.02 洛谷P3952 时间复杂度(模拟)
传送门 惊叹考场dubuffdubuffdubuff. 这题还没有梭哈难啊233. 直接按照题意模拟就行了. 代码: #include<bits/stdc++.h> using names ...
- tp5中代替tp3.2中的一些方法
U方法 U方法是TP中的生成路由的内置方法,现在这个方法可以完全使用url方法替换 I方法 之前的TP有个I方法用来接收请求参数,目前可以使用input方法替代 C方法 c方法被config方法代替
- UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)
题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...
- RabbitMQ c#版实现(转)
出处:https://www.cnblogs.com/hanfan/p/9842301.html 网上很多人已经总结的很好了,比如今天看到的这个.https://www.cnblogs.com/Lip ...
- 安卓hid驱动触摸屏
在kernel/drivers/hid/ 目录下三个文件中添加usbtouch的pid vid, 文件分别是hid-multitouch.c .hid-ids.h.hid-core.c 具体如何添加可 ...
- VIP之FrameBuffer
2.VIP Frame Buffer 1.原来我是一直存在一个疑惑,demo上说VIP Frame Buffer输出是固定的60fps,但是在NiosII的程序中我没有找到设置输出为60fps的设置 ...
- 百度Web Uploader组件实现文件上传之分片上传(一)
当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件.另外分片传输能够更加实时的跟踪上传进度.多的不说了直接怼代码 前端是三个监听:一个是获取md5,一个是分片,最后一个是合并代码 <! ...
- Hibernate利用JDBC批操作
@org.junit.Test public void testBatch() { session.doWork(new Work() { @Override public void execute( ...
- AIX 补丁升级
下载地址:http://www-933.ibm.com/support/fixcentral 1.root登陆系统: 2.对系统进行备份或者克隆(见上一篇抄袭IBM官方文档的文章): 3.官方建议为/ ...