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

相关推荐
码云之上2 小时前
小程序 iOS 多输入框焦点乱序脱坑记
ios·微信小程序·taro
Greg_Zhong2 天前
微信小程序 + 腾讯云人体分析:从 0 到 1 实现 AI 抠图打卡合照(细节待更新~)
人工智能·微信小程序·腾讯云·ai抠图-ai打卡拍照
java1234_小锋4 天前
【免费】基于Python的微信小程序网约车(打车,在线叫车,移动出行)系统(FastAPI+Vue3) 锋哥原创出品,必属精品
微信小程序·小程序·fastapi·网约车系统·在线叫车系统
拖孩5 天前
用 AI 重解千年观音灵签,做了一个微信小程序,每天摇一摇,命运给你回应
前端·后端·微信小程序
java1234_小锋6 天前
【免费】微信小程序网约车(打车,在线叫车,移动出行)系统(SpringBoot4+Vue3) 锋哥原创出品,必属精品
微信小程序·网约车·在线叫车·移动出行
AI砖家7 天前
AI编程—微信小程序开发规范
微信小程序·小程序·notepad++·ai编程
sam-zy7 天前
微信小程序+ESP8266+Arduino 开发智能插座,有本地OTA功能
微信小程序·小程序
A24207349308 天前
微信小程序开发:常用基础语法与指令详解
微信小程序·小程序·notepad++
laboratory agent开发8 天前
2026小程序系统多维度技术与落地能力深度解析
微信小程序
laboratory agent开发11 天前
多维度拆解小程序平台:数字化经营工具的理性选择指南
微信小程序