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部分就不写了,主要是底部按钮的样式,至此就完成啦!

相关推荐
用户4324281061141 天前
微信小程序从0到1接入微信支付的完整攻略
微信小程序
spmcor3 天前
微信小程序 setStorageSync 踩坑实录:别让"顺手一存"变成"隐形炸弹"
微信小程序
用户4324281061143 天前
小程序埋点设计规范:如何设计可扩展的数据采集体系
微信小程序
玩烂小程序5 天前
微信小程序手串DIY功能开发实录:飞入动画 + 环形排布 + 拖拽换序 + 旋转查看 + 保存设计
微信小程序
何时梦醒5 天前
HTML5 Canvas 从入门到实战:手把手教你打造一款"打飞机"小游戏
微信小程序
master3365 天前
SSL 证书链问题导致微信小程序无法正常工作
网络协议·微信小程序·ssl
wuxia21186 天前
在5种环境中编写点击元素改变内容和颜色的JavaScript程序
javascript·微信小程序·vue·jquery·react
it-10246 天前
抖音快手短视频去水印微信小程序/一键去水印/小程序去水印接口代码
微信小程序·小程序·php
夏天测7 天前
微信小程序自动化漏洞挖掘流水线:从缓存提取到密钥验证全流程实战
python·网络安全·微信小程序·漏洞挖掘
it-10247 天前
微信小程序短视频去水印/抖音短视频去水印/免费去水印源码
微信小程序·小程序·视频去水印