接到个项目做微信小程序的,需要将手机中的页面保存到手机相册中,效果图如下

首先想到的就是利用canvas画图然后在保存到相册,看起来很简单网上也有很多例子,但都不完整,很多网友分享的都在半吊子工程,只是简单的实现效果和代码整理出来,应该是页面还没上线就分享的缘故吧,直接使用它们的代码实现,只能做出粗糙的效果,还有兼容性和坑没有体现和总结出来.我这里是完完全全可以上线的效果.做了几天,主要是想总结一下这些坑.

啥也别说了,直接上代码吧!!!!

1.html

<view class='wrap' style="height:{{screenHeight}}" ><view class='top'><view class='portrait'><image src="{{portrait_url}}" ></image></view><view class='name'><text>{{user_name}}</text></view><view class='luck_name'> <text>{{luck_level_preMsg}}{{luck_level}}</text></view><view class='luck_item'><text>{{luck_name}}</text></view><view class='luck_pic'> <image src="{{luck_image}}"></image> </view><view class='luck_app'> <image src="{{wxAppImage_url}}"></image> </view><view class='luck_tips'> <text>{{tipMsg}}</text> </view></view>
</view><view class='bottom'><view class='btn' bindtap='doSavecanvasImage'>保存到手机</view>
</view><view class='canvasstyle'><canvas   style="width:{{canvasWidth}};height:{{canvasHeight}};" canvas-id='myCanvas'  ></canvas>
</view>
<view class='images'><image src='{{portrait_url}}' bindload="loadImg1"/><image src='{{luck_image}}' bindload="loadImg2"/><image src='{{wxAppImage_url}}' bindload="loadImg3"/>
</view>

3.js


const app = getApp()
let util = require('../../../utils/util.js');
import http from '../../../utils/service';Page({/*** 页面的初始数据*/data: {canvasHidden: true,count:0,timer:null,getPageData_url: '/discovery/draw/result/getSharePage.draw',portrait_url: '',user_name: '',luck_level_preMsg: '恭喜您获得',luck_level: '', //获得几等奖luck_name: '',  //奖品名称luck_image: '',wxAppImage_url: 'https://iobs02.pingan.com.cn/download/zztj-hrx-dmz-prd/9d91cddf67d1283c01687fd6a4b70040', //小程序名称tipMsg: '长按识别小程序,「HRX抽奖」好运爆棚~',    //小程序名称shareImgPath: '',canvasWidth:'',canvasHeight:'',screenWidth: '', //设备屏幕宽度; screenHeight: '',//浏览器高度ratio: '',unit:'',shareImgSrc: '',shareTempFilePath: '',networkStatus: true,},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {this.getPageData(options);let that = this;wx.hideTabBar(); //隐藏底部Tab导航wx.getSystemInfo({  //获取用户设备信息,屏幕宽度success: res => {that.setData({screenWidth: res.screenWidth,screenHeight: res.screenHeight - 140 + 'px',ratio: res.pixelRatio,canvasWidth: res.screenWidth+"px",canvasHeight: (res.screenWidth / 375) * 540 + 'px',})}})},onHide: function () {this.data.timer && clearInterval(this.data.timer);},/*** 生命周期函数--监听页面初次渲染完成*/onReady: function () {var that = this;var context = wx.createCanvasContext('canvas')},drawcancas: function () { //绘制文本//设置画布相关属性var ratio = this.data.ratio;var unit = this.data.screenWidth / 375;var ctx = wx.createCanvasContext('myCanvas');ctx.setFontSize(14);ctx.textAlign = 'center';//绘制背景图;ctx.fillStyle = "#FFF";ctx.fillRect(0, 0, this.data.screenWidth,520);//test绘制圆形的头像 ctx.beginPath();let avatarurl_width = 40;    //绘制的头像宽度let avatarurl_heigth = 40;   //绘制的头像高度let avatarurl_x = this.data.screenWidth / 2 - 20;   //绘制的头像在画布上的位置let avatarurl_y = 30;   //绘制的头像在画布上的位置ctx.setStrokeStyle('#FFF');ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2);ctx.save();ctx.clip();ctx.drawImage(this.data.portrait_url, avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth);//头像;ctx.restore();ctx.setFontSize(14);ctx.fillStyle = '#1D1D26';ctx.fillText(this.data.user_name, this.data.screenWidth / 2, 92);//名字;ctx.font = '18rpx PingFangSC-Regular'ctx.fillText(this.data.luck_level_preMsg + this.data.luck_level, this.data.screenWidth / 2, 130);//几等奖ctx.font = '14rpx PingFangSC-Regular';ctx.fillText(this.data.luck_name, this.data.screenWidth / 2, 160);//绘制奖品名称;ctx.drawImage(this.data.luck_image, 40, 180, this.data.screenWidth - 80, 170);//绘制奖品图像;ctx.drawImage(this.data.wxAppImage_url, this.data.screenWidth / 2 - 45, 370, 93, 93);//绘制二维码;ctx.setFontSize(14);ctx.setFillStyle('#5e7436');ctx.fillStyle = 'rgb(174,174,174)';ctx.fillText(this.data.tipMsg, this.data.screenWidth / 2, 500);//识别小程序提示;var that = this;ctx.stroke();ctx.draw();},getTempFilePath: function () {  //将图片存到临时路径let that=this;let unit = this.data.screenWidth / 375;let ratio = this.data.ratio;wx.canvasToTempFilePath({x: 0,y: 0,width: unit*375,height: unit*540,destWidth: ratio*375,destHeight: ratio*540,canvasId: 'myCanvas',success: function (res) {that.setData({shareImgSrc: res.tempFilePath})if (!res.tempFilePath) {wx.showModal({title: '提示',content: '图片生成中,请稍后重试',showCancel: false,})}wx.getSetting({ //存储照片之前先查看是否有存储权限,如果没有权限,先打开设置权限success(res) {if (res.authSetting['scope.writePhotosAlbum'] == false) {wx.showModal({title: '”HRX抽奖“想访问您的相册0',content: '为了保存图片到您的手机,HRX抽奖需要获取您照片的访问权限, 点击「设置」按钮前往设置',cancelText: '不允许',cancelColor: '#A5A5A8',confirmColor: '#FC652F',confirmText: '设置',success: function (res) { // if (res.confirm) { //点击确定wx.openSetting() //打开设置按钮}},fail: function (res) {},complete: function (res) {}})} else if (res.authSetting['scope.writePhotosAlbum'] == true || JSON.stringify(res.authSetting) == "{}" || res.authSetting['scope.writePhotosAlbum'] == undefined) {that.saveImageToLocal();}}})},fail: function (res) {  //图片生成失败}})},//下载图片saveImageToLocal() {let that = this;wx.saveImageToPhotosAlbum({filePath: that.data.shareImgSrc,success(res) {wx.showToast({title: '图片保存成功',icon: 'success',duration: 1800})},fail(res) {}})},doSavecanvasImage() {let that = this;wx.showLoading()if (this.data.timer){clearInterval(this.data.timer)}let timer=setInterval(()=>{if (that.data.count>=3){that.data.timer && clearInterval(that.data.timer)timer && clearInterval(timer)wx.getNetworkType({success(res) {wx.hideLoading()if (res.networkType == "none") {wx.showToast({title: '无网络,图片保存失败',icon: 'none',duration: 2000})} else {that.getTempFilePath();}}})}},500)this.setData({ timer: timer})},getPageData(options) {let that = this;http({url: that.data.getPageData_url,loadingFlag: true,data: {drawActivityId: options.seqId || undefined,validSign: options.validSign || undefined},success(res) {that.setData({user_name: res.data.data.userName,portrait_url: res.data.data.headPicUrl,//头像luck_level: res.data.data.prizeLevel, //获得几等奖luck_name: res.data.data.prizeName,//奖品名称luck_image: res.data.data.prizePicUrl || "https://iobs02.pingan.com.cn/download/zztj-hrx-dmz-prd/9d8fa0c067d13fdd01686b1c05bc0036"//奖品图片})//加载图片到本地function fn1(){return new Promise(function (resolve, reject) {wx.getImageInfo({  //保存头像到本地//src: that.data.portrait_url,success: function (res) {resolve(res)that.setData({portrait_url: res.path,})},fail: function (res) {wx.showModal({title: 'fn1fail',content: JSON.stringify(res),showCancel: false,confirmText: '确定'})reject("catfn1");},complete: function (res) {}})});}function fn2() {return new Promise(function (resolve, reject) {wx.getImageInfo({  //将奖品图片保存到本地src: that.data.luck_image,success: function (res) {resolve(res)that.setData({luck_image: res.path,})},fail: function (res) {reject("catfn2");}})})}function fn3() {return new Promise(function (resolve, reject) {wx.getImageInfo({  //将二维码保存到本地src: that.data.wxAppImage_url,success: function (res) {resolve(res)that.setData({wxAppImage_url: res.path,})},fail: function (res) {reject("catfn3");},complete: function (res) {}})})}Promise.all([fn1(),fn2(),fn3()]).then((data) => {that.drawcancas();})},fail(res) {}})},loadImg1(res) {this.setData({count: this.data.count+1,})},loadImg2 (res) {this.setData({count: this.data.count + 1,})},loadImg3(res) {this.setData({count: this.data.count + 1,})}
})

转载于:https://my.oschina.net/u/4053340/blog/3007106

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

  1. 微信小程序将base64图片格式保存至手机相册

    // 保存图片 let settingWritePhotosAlbum = false; export const saveImg = function(url, callback ) {//获取文件 ...

  2. 微信小程序之canvas画图

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

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

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

  4. 微信小程序 下载图片或视频保存到手机系统相册

    //downloadSaveFile.js/*** 下载单个文件* @param {string} [type]* @param {string} url* @callback successCall ...

  5. 微信小程序使用web-view,内嵌跳转h5踩坑记!!

    先说说我遇到的错误,项目在部署测试环境之前一切正常,没有遇到任何阻碍性bug,但是部署测试环境之后,跳转h5报如下错误: 然后我就去查了官方文档,以及各类技术文档,意思就是需要在微信公众平台配置业务域 ...

  6. 【微信小程序】将base64图片保存至本地

    需求描述 微信小程序中,下载一个报告文件,直接可获取到的是报告图片的base64格式. 参考文章 1.微信小程序实现图片下载功能 2.微信小程序把base64的图片保存到手机相册 代码实现 1.wxm ...

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

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

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

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

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

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

最新文章

  1. android 平板安装程序开发者,android – 限制平板电脑中的应用安装
  2. c+和python哪个快-C/C++比python快是什么意思?
  3. RHEL 5基础篇—常见系统启动类故障
  4. 如何在官网下载java JDK的历史版本
  5. EasyUI:textbox自定义验证手机号(正则)
  6. visual studio 2013 快速安全ocx(ActiveX控件)开发
  7. win10字体模糊设置
  8. 51汇编——矩阵键盘
  9. 斑马打印机链接数据库实现自动打印
  10. 无法从“cstring”转换为“lpcstr”_别用Sketchup一个个转模型的版本了,用这些批量转换器真香…...
  11. Linux下C语言调用paly播放音频文件
  12. SMT贴片加工防静电基础知识
  13. EMC磁珠到底什么样的特性
  14. [NOI2017]蔬菜
  15. S32K1XX系列单片机 ——MCAL 的CAN模块配置
  16. Java面试题---第四阶段
  17. EM4001射频模块读卡
  18. 常用的一些子域名,旁站查询
  19. java map转JSON对象
  20. LTE学习:PCFICH信道总结

热门文章

  1. 深度强化学习下移动机器人导航避障
  2. 解决Win10系统由于INF文件失效导致安卓MTP驱动安装失败的问题
  3. PageRank网页排名算法
  4. 【网络安全】上网行为管理
  5. 以智能钻井为例,深度解析数字油田的智能化建设
  6. hdl-grap-slam 运行以及编译
  7. 移动终端及常见的操作系统
  8. poj 2594 Treasure Exploration
  9. 教师专业发展规划计算机教师,初中信息技术教师个人发展计划
  10. JS生成EXCEL(Chrome浏览器)