微信小程序保存图片到本地

<!-- 模板提示 -->
<view class="danger-swapper" wx:if="{{dangHint}}">
  <view class="mbBox">
     <view  bindtap="submitMb">快来点我呀</view>
      <view class="mb7" bindtap="saveCanvas">确 定</view>
  </view>
</view>
<!-- 输入签名 -->
<view class="danger-swapper" wx:if="{{dangeMb}}">
  <view style="width:100%">
    <view class="container">
      <canvas canvas-id="firstCanvas" id='firstCanvas' disable-scroll="true" bindtouchstart="bindtouchstart" bindtouchmove="bindtouchmove"></canvas>
      <view class="canBtnBox">
        <view bindtap='clear' class="clear canBtn">
          清 空
        </view>
        <view bindtap='export' class="submit canBtn">
          提 交
        </view>
      </view>
      </view>
  </view>
</view>

答完题跳转到新页面的时候在新页面需要签名

  // 跳转
  onFinish: function () {
        const check = () => {
          if (this.data.user.id== 97) {
             return false;
          }
          if (this.data.user.id== 101) {
            return false;
          }
          return true;
        };
        const id= check();
        if(this.data.user.id== 7 && id){
          // 保存dangHint在本地 控制下次进入页面是否弹出
          wx.setStorage({key:"dangHint",data:true})
        }
        wx.reLaunch({ url: '下一个页面地址' });
  },

进入新页面时需要弹出提示信息 通过dangHint控制

data:{
	context: null,
    imgUrl:'', // 手写签名img
    bkgimgUrl:'./../../img/abc.jpg', 
	dangeMb:false, //控制画板
    dangHint:wx.getStorageSync('dangHint') //进页面是否显示提示内容
}
onShow:function(){
	  this.setData({ dangHint: wx.getStorageSync('dangHint') });
	  if(this.data.dangHint){
	    wx.showModal({
	      title: '提 示',
	      content: '点击屏幕任意位置弹出签名框',
	      showCancel: false,
	    });
	  }
}
 // 点击弹出画板 输入签名
 submitMb(){
    this.setData({
      dangeMb:true
    })
 },
  // 导出图片 自己写出来的签名图
  export: function () {
    let that = this;
    that.data.context.draw(true, wx.canvasToTempFilePath({
      fileType: 'jpg',
      canvasId: 'firstCanvas',
      success:(res) => {
        let { tempFilePath } = res;
        this.setData({ 
                imgUrl:tempFilePath,
                dangeMb:false
        });
      },
      fail() {
        wx.showToast({
          title: '导出失败',
          icon: 'none',
          duration: 2000
        })
      }
    }))
  },
  // 开始触摸 记录开始点
bindtouchstart: function(e) {
  console.log("bindtouchstart", e);
  this.data.context.moveTo(e.changedTouches[0].x, e.changedTouches[0].y)
  },
 // 记录移动点,刷新绘制
 bindtouchmove: function(e) {
    console.log("bindtouchstart", e);
    this.data.context.lineTo(e.changedTouches[0].x, e.changedTouches[0].y);
    this.data.context.stroke();
    this.data.context.draw(true);
    this.data.context.moveTo(e.changedTouches[0].x, e.changedTouches[0].y);
  },
  // 清空画布
 clear: function() {
  this.data.context.draw();
  },
  // 保存
  saveCanvas(e){
  // 调用后台保存接口
    request
      .submit_fpm_user_commitment(this, { url:this.data.imgUrl })
      .then((res) => {
        if(res.data.success){
          //获取相册授权
          wx.getSetting({
            success:(res) => {
              console.log(res.authSetting)
              if (!res.authSetting['scope.writePhotosAlbum']) {
                wx.authorize({
                  scope: 'scope.writePhotosAlbum',
                  success:() => {
                    //用户同意授权
                    this.saveImgToLocal();
                    console.log(2)
                  },
                  fail() {//用户拒绝授权
                    wx.showModal({
                      title: '提示',
                      content: '保存失败,请手动打开相册授权',
                      showCancel: false
                    })
                  }
                })
              } else {//用户已经授权过了
                this.saveImgToLocal();
                console.log(1)
              }
            }
          })
        }else{
          wx.showModal({
            title: '提示',
            content: '保存失败',
            showCancel: false
          })
        }
      })
      .catch(() => {
      })
      .finally(() => {
        this.setData({
          dangHint:false,
        })
        wx.setStorage({key:"dangHint",data:false})
        wx.removeStorageSync('dangHint')
      });
  },
  saveImgToLocal: function (e) {
    const user = wx.getStorageSync('User');
    console.log(user)
    let imgUrl = this.data.imgUrl;
    let mobile = user.mobile ? user.mobile : '';
    // 我比较懒 因为导出的图片布局很恶心 所以我索性贴上去一张图片 只用把动态的数据画上去就可以了
    // 哈哈 整个背景布局是img 签名是img 手机号不是
    const ctx = wx.createCanvasContext('share');
    // 第一个参数 距离left距离
    // 第二个参数 距离top距离
    // 第三第四 宽高
    ctx.drawImage('./../../img/abc.jpg',0,0,300 ,550); // 背景布局
    ctx.drawImage(imgUrl,210,370,50,40); // 签名
    // ctx.setFontSize(18)
    ctx.fillText(mobile,210,423) // 手机号
    ctx.draw()
    // ctx.draw(true)
    
    //将生成好的图片保存到本地,需要延迟一会,绘制期间耗时
    setTimeout(function() {
      wx.canvasToTempFilePath({
          canvasId: 'share',
          success:(res) => {
              var tempFilePath = res.tempFilePath;
              console.log('tempFilePath地址是' + tempFilePath)
                   wx.saveImageToPhotosAlbum({
                    filePath: tempFilePath,
                    success: (data) => {
                      wx.showToast({
                        title: '保存成功',
                        icon: 'success',
                        duration: 2000
                      })
                    },
                    fail: function(res) {
                      console.log(res);
                   }
                  })
              // 不要加下面这些!!!!微信开发者工具可以正常使用 真机调试就报错
              // wx.downloadFile({
              //   url: tempFilePath,
              //   success:(res) => {
              //     console.log(res);
              //     //图片保存到本地
              //     wx.saveImageToPhotosAlbum({
              //       filePath: tempFilePath,
              //       success: (data) => {
              //         wx.showToast({
              //           title: '保存成功',
              //           icon: 'success',
              //           duration: 2000
              //         })
              //       },
              //     })
              //   },
              //   fail: function(res) {
              //       console.log('downloadFile报错')
              //       console.log(res);
              //   }
              // })
          },
          fail: function(res) {
              console.log(res);
          }
      });
  }, 500);
  },

遇到的问题
canvasToTempFilePath绘制图片到画布上,真机不显示,开发工具显示,相关域名都配置上了,打印看到的是地址返回不一样;
真机返回的是:wxfile://tmp_666.png
开发工具返回的是:"http://tmp/666

第一次用 咱也找不到原因 只能自己摸索 发现把 wx.downloadFile 去掉就ok了 应该因为我是本地图片不需要走wx.downloadFile的原因吧 但是wx你难道不能给我一个提示吗???
亲测已成功 如果我说的不对 欢迎讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用 uni.saveImageToPhotosAlbum 接口将图保存到微信小程序的本地相册中。 首先,需要在小程序的 app.json 中添加如下权限: ``` "permission": { "scope.writePhotosAlbum": { "desc": "保存图片到相册需要使用" } } ``` 然后,在需要保存图片的页面或组件中,可以调用 uni.saveImageToPhotosAlbum 接口,如下所示: ``` uni.saveImageToPhotosAlbum({ filePath: '图文件路径', success: function () { console.log('保存图片到本地相册成功'); }, fail: function () { console.log('保存图片到本地相册失败'); } }); ``` 注意: - filePath 参数为图文件的本地路径。 - uni.saveImageToPhotosAlbum 接口需要用户授权,如果用户拒绝授权,则无法保存图片到本地相册。 在用户授权后,就可以将图保存到微信小程序的本地相册中了。 ### 回答2: 在uniapp中,可以使用uni.request和uni.downloadFile这两个api来保存微信小程序中的图到本地。 首先,我们需要将图保存到服务器上,可以通过uni.request来完成。将图的url传递给uni.request,并设置responseType为arraybuffer。示例代码如下: uni.request({ url: '图url', responseType: 'arraybuffer', success: res => { // res.data即为图的二进制数据 // 接下来将图保存到本地 } }) 接着,我们可以通过uni.downloadFile api来将图保存到本地。将res.data作为参数传递给uni.downloadFile的url参数,并设置保存路径filePath。示例代码如下: uni.downloadFile({ url: 'data:image/png;base64,' + uni.arrayBufferToBase64(res.data), success: res => { if (res.statusCode === 200) { // res.tempFilePath为图保存到本地的临时文件路径 console.log(res.tempFilePath) } } }) 最后,我们可以将保存到本地的临时文件移动到用户的相册中,使用uni.saveImageToPhotosAlbum来完成。示例代码如下: uni.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success: res => { console.log('保存成功') }, fail: err => { console.log('保存失败') } }) 以上就是使用uniapp微信小程序保存图片到本地的简单步骤。需要注意的是,uniapp也提供了其他的api和方法来实现保存图片的功能,可以根据具体需求选择适合的方法。 ### 回答3: uniapp是一种跨平台开发框架,可以同时开发多个平台的应用程序,包括微信小程序。在uniapp中,我们可以使用uni-app插件来实现将图保存到本地的功能。 具体步骤如下: 1. 首先,我们需要在uniapp项目中引入uni-app插件,可以通过在项目的根目录下的`uni.xml`文件中的`easycom`节点中添加`"@dcloudio/uni-save-image"`来引入插件。 2. 在需要保存图片的页面中,使用`uni.saveImageToPhotosAlbum()`方法来保存图片到本地相册。该方法需要传入一个对象参数,其中包含要保存的图路径`filePath`和一个回调函数`success`用来处理保存成功的情况,和一个`fail`函数用来处理保存失败的情况。 3. 在回调函数中,我们可以通过判断返回值中的`errMsg`属性来判断保存是否成功,如果成功则显示保存成功的提示,否则显示保存失败的提示。 下面是一个示例代码: ``` <template> <view> <image src="/static/image.png"></image> <button @click="saveImage">保存图片</button> </view> </template> <script> export default { methods: { saveImage() { uni.saveImageToPhotosAlbum({ filePath: '/static/image.png', success(res) { uni.showToast({ title: '保存成功', icon: 'success' }); }, fail(res) { uni.showToast({ title: '保存失败', icon: 'none' }); } }); } } } </script> ``` 以上就是在uniapp微信小程序保存图片到本地的简单步骤和示例代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值