wx.canvasToTempFilePath生成图片保存到相册

微信小程序保存当前画布指定区域的内容导出生成指定大小的图片,记录一下

api:wx.canvasToTempFilePath

效果:

代码:wxml

复制代码
 <canvas style="width: {{screenWidth}}px; height: {{canvasHeight}}px;" canvas-id="myCanvas"></canvas>

  <view class="bottom-btn">
    <van-button custom-class="info-sub" bind:tap="submit" block>下载图片</van-button>
  </view>

js

复制代码
onLoad(options) {
	this.initCanvas()
},
initCanvas(){
	  // 自动计算收货地址高度,每一个收货地址占高度60,所以没加一条,高度+60
      let height = this.data.list.length <7?this.data.canvasHeight:this.data.canvasHeight + (this.data.list.length -6 )*60;
      console.log(height,'height');
      var ctx = wx.createCanvasContext('myCanvas')
      ctx.fillStyle = '#fff'  // 背景色一定要设置,否则下载到图库中会有bug
      ctx.fillRect( 0, 0, this.data.screenWidth, height)   // 设置画布宽高
      ctx.setFillStyle('#333')
      ctx.setFontSize(13);
      ctx.setTextAlign('left');
      // 填充内容
      ctx.fillText('申请时间', 25, 65, 200, 30);
      ctx.fillText(this.data.time, 160, 65, 200, 30);
      ctx.fillText('会员ID', 25, 95, 200, 30);
      ctx.fillText(this.data.member, 160, 95, 200, 30);
      ctx.fillText('昵称', 25, 125, 200, 30);
      ctx.fillText(this.data.nickName, 160, 125, 200, 30);
      ctx.fillText('电话', 25, 155, 200, 30);
      ctx.fillText(this.data.mobile, 160, 155, 200, 30);
      ctx.setFontSize(15);
      ctx.setFillStyle('#333')
      ctx.fillText('配送地址:', 20, 195, 200, 30);
      ctx.setFillStyle('#333')
      ctx.setFontSize(11);
      // 地址是循环出来的,由于后端返回省市区是编号,我这边要转换
      for (var i = 0; i < this.data.list.length; i++) {
        let pro = seekProvince(this.data.list[i].province).name
        let city = seekCity(this.data.list[i].city).name
        let area = seekArea(this.data.list[i].area).name
        ctx.fillText(pro+city+area, 25, 220+(i*60), 200, 30);
        ctx.fillText(this.data.list[i].addressDetail, 25, i==0?235:235+(i*60), 200, 30);
        ctx.fillText(this.data.list[i].memberName+' '+this.data.list[i].mobile, 25, i==0?250:250+(i*60), 200, 30);
      }
      let self = this
      // 这里需要注意,直接使用ctx.draw(),会提示我报错画布为空,将延迟期异步写到draw回调里,可以解决这个问题
      ctx.draw(false,
        async()=>{
          setTimeout(() => {
            wx.canvasToTempFilePath({
              x: 0,
              y: 0,
              width: self.data.screenWidth,
              height: self.data.canvasHeight,
              destWidth: self.data.screenWidth * 3,
              destHeight: self.data.canvasHeight * 3,
              canvasId: 'myCanvas',
              success(res) {
                self.setData({
                  temp_path: res.tempFilePath
                })
                console.log(res.tempFilePath)
              },
              fail(err){
                console.log(err,'这是报错的');
              }
            },self)
          }, 100);
        }
      )
    },
// 点击下载图片将画布内容下载到手机相册中
submit() {
    this.saveImgToAlbum()
  },
  saveImgToAlbum() {
      console.log(this.data.temp_path,'----')
      let self = this
      wx.showLoading({
        title: '保存中...',
        icon: 'none'
      })
      setTimeout(()=>{
          wx.saveImageToPhotosAlbum({
              filePath: self.data.temp_path,
              success(res) {
                  wx.hideLoading({
                    success: (res) => {},
                  })
                  wx.showToast({
                      title: '保存成功',
                      icon: 'none'
                  })
              },
              fail(res) {
                  wx.hideLoading({
                      success: (res) => {},
                    })
                  wx.showToast({
                      title: '保存失败,请重新保存'+res.errMsg,
                      icon: 'none'
                  })
                  console.log(res.errMsg)
                   wx.getSetting({
                      success(res) {
                          if (!res.authSetting['scope.writePhotosAlbum']) {
                              self.setData({
                                  showAuth: true
                              })
                          } else {
                              self.setData({
                                  showAuth: false
                              })
                          }
                      }
                  })
  
              }
          })
      }, 1000) 
  },

css部分就不写了,主要是底部按钮的样式,至此就完成啦!

相关推荐
我命由我1234514 小时前
微信小程序 - 避免在 data 初始化中引用全局变量
开发语言·前端·javascript·微信小程序·小程序·前端框架·js
我命由我1234517 小时前
微信小程序 bind:tap 与 bindtap 的区别
开发语言·前端·javascript·微信小程序·小程序·前端框架·js
我命由我1234520 小时前
微信小程序 - 页面跳转并传递参数(使用路由参数、使用全局变量、使用本地存储、使用路由参数结合本地存储)
开发语言·前端·javascript·微信小程序·小程序·前端框架·js
毕设源码-邱学长20 小时前
【开题答辩全过程】以 基于微信小程序的社区老年人活动中心信息管理系统的设计与实现 为例,包含答辩的问题和答案
微信小程序·小程序
李慕婉学姐21 小时前
基于微信小程序的康复医疗问诊服务平台5855qb95(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·微信小程序
项目題供诗21 小时前
微信小程序黑马优购(项目)(六)
微信小程序·小程序
chéng ௹21 小时前
uniapp APP和微信小程序横屏模式
微信小程序·小程序·uni-app
Dest1ny-安全2 天前
CTF入门:国内线上CTF比赛时间及部分题目资源
网络·安全·web安全·微信小程序·php
kyh10033811202 天前
去水印微信小程序搭建
大数据·微信小程序·去水印·短视频去水印·去水印微信小程序