微信小程序中裁剪图片以及压缩到指定尺寸并上传

本文分为两个内容,分别是裁剪图片和压缩

引出问题

1.为何要裁剪图片
因为需要上传头像,但是每个型号的手机拍出来的照片尺寸都不太一样,不能统一,所以,希望在上传之前进行自主裁剪,保证上传到服务器上的尺寸一致,规范管理。

2.为何要压缩图片
因为我们用于读取头像照片的另一端硬件对文件大小非常敏感,太大保存失败,所以进行压缩。
而微信小程序中自带的压缩图片的方法为 wx.compressImage 要求比较严格,还不能够压缩成自己想要的尺寸和大小。所以被弃用了,我们另外找了一个方法来压缩成我们需要的文件大小。

裁剪图片

我们裁剪图片用的是 image-cropper 这个组件

小程序试用:
在这里插入图片描述

因为文档比较麻烦,我直接下载了代码来看使用方法。

根据文档以及代码,我们看到,这个 demo 页面是独立了一个上传页面,然后引入了这个组件。

文件目录格式:
在这里插入图片描述
cropper 就是当前页面,引入的就是 component 里的 image-cropper

展示页面
在这里插入图片描述
我们进行了一部分改造,把原来是页面的功能,根据要求改成了组件

在这里插入图片描述
因为上下左右那些功能,均可用手势完成,就去除了这一部分功能。

将页面修改成 组件需要注意一些问题:

  • 设置优先级,不然有内容穿透问题
  • 用 if 控制显示与否的时候,初始化组件,之前是在页面加载的时候初始化,现在显示的时候初始化;也可以直接使用 hidden ,这样组件始终都渲染只是不显示而已
    在这里插入图片描述

压缩图片到指定大小

这个的思路就是将图片重绘成 canvas 然后把 canvas 导出成我们需要尺寸的图片并上传。

现在 wxml 中添加一个 canvas 画布,但是不能出现在页面视野中。
由于 canvas 不能够显示隐藏,所以使用 样式控制

<canvas canvas-id="attendCanvasId" style="width:{{canvasWidth}}px;height:{{canvasHeight}}px;position: absolute;left:-8000px;top:-8000px;"></canvas>
/**
  * 组件的初始数据
  */
 data: {
   src: '',
   canvasWidth: 0,
   canvasHeight: 0,
   imageShow: false
 },
//如果图片大于1M就要进行压缩处理
if (res.size > 200000) {
  wx.showLoading({
    title: '正在压缩中...',
    mask: true
  })
  //获取图片信息
  wx.getImageInfo({
    src: file.url,
    success: function (rr) {
      var ctx = wx.createCanvasContext('attendCanvasId', that);
      var ratio = 1;
      var canvasWidth = rr.width
      var canvasHeight = rr.height;
      var quality = 0.3; //图片质量
      while (canvasWidth > 1000 || canvasHeight > 1000) {
        //比例取整
        canvasWidth = Math.trunc(rr.width / ratio)
        canvasHeight = Math.trunc(rr.height / ratio)
        ratio += 0.1;
      }
      quality = (quality + (ratio / 10)).toFixed(1);
      if (quality > 1) {
        quality = 1;
      }
      //设置canvas尺寸
      that.setData({
        canvasWidth: canvasWidth,
        canvasHeight: canvasWidth
      });
      ctx.drawImage(file.url, 0, 0, canvasHeight, canvasWidth); //将图片填充在canvas上
      ctx.draw();
      //下载canvas图片
      setTimeout(function () {
        wx.canvasToTempFilePath({
          canvasId: 'attendCanvasId',
          width: canvasWidth,
          height: canvasWidth,
          destWidth: canvasWidth,
          destHeight: canvasHeight,
          fileType: 'jpg',
          quality: quality,
          success: function success(path) {
            wx.hideLoading()
            //这里是将图片上传到服务器中
            that.upload(path.tempFilePath);
          },
          fail: function fail(e) {
            wx.hideLoading();
            wx.showToast({
              title: '头像上传失败',
              icon: 'none',
              duration: 2000
            });
          }
        }, that);
      }, 1000);
    }
  });
} else { //小于1M的就不用压缩了
  that.upload(file.url)
}

以上代码均为部分代码,非完整代码,请选择复制

为了压缩也曾百度过很多方法,只有这个比较实用和简单。可留言,互相交流

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 微信小程序上传图片的方法很简单,你可以使用微信小程序的API来实现,具体步骤如下:1. 首先,在小程序的页面,使用<image>标签来引用图片;2. 然后,在小程序的js文件,调用wx.uploadFile函数来上传图片;3. 最后,在服务器端,使用相应的接口来处理上传图片,完成图片上传的操作。 ### 回答2: 微信小程序提供了丰富的接口来实现图片上传的功能。 首先,我们需要在小程序的代码引入上传文件的API,即wx.uploadFile。该接口可以将本地图片文件上传到服务器。 然后,我们可以在小程序界面添加一个图片选择的按钮,通过调用wx.chooseImage接口来实现用户选择图片的功能。这个接口会返回用户选择的图片的临时文件路径。 接下来,我们需要在小程序创建一个事件处理函数,当用户点击图片选择按钮后,会触发该函数。函数可以调用wx.uploadFile接口,将选择的图片文件上传到服务器。 上传文件的接口需要传入几个参数: - url:服务器的地址,用于接收上传文件的请求。 - filePath:被上传的文件的临时路径。 - name:后端接口接收文件的字段名。 - header:请求头,用于传递其他的参数。 - formData:除文件外,需要向服务器提交的额外数据。 在上传成功或失败的回调函数,我们可以根据服务器返回的结果进行相应的处理,如展示上传成功后的图片或提示上传失败等。 需要注意的是,在使用小程序上传文件的过程,我们还需要确保服务器端已经配置好了文件上传的接口,并且服务器端能够正确地处理上传文件的请求。具体的服务器端接口开发过程可以根据后端语言和框架的不同进行相应的实现。 总结起来,微信小程序上传图片的过程可以简单概括为:用户选择图片 → 调用上传文件API将图片上传到服务器 → 处理上传成功或失败的回调函数来展示结果或提示用户。 ### 回答3: 微信小程序提供了上传图片的接口,开发者可以按照以下步骤来实现图片上传功能: 1. 当用户需要上传图片时,可以在前端界面添加一个按钮或者其他触发上传事件的元素。 2. 在前端代码,使用wx.chooseImage方法选择需要上传图片。该方法会调用用户手机的相册或者拍照功能,用户可以选择一张或者多张图片。 3. 选择图片之后,可以使用wx.uploadFile方法进行上传。该方法需要传入一个配置对象,包含了上传的url、filePath、name等参数。 - url参数:指定图片上传的接口地址。 - filePath参数:选择的图片的本地路径。 - name参数:图片对应的后端字段名。 4. 调用wx.uploadFile方法之后,会执行一个上传过程,期间可以使用wx.showToast方法显示上传进度。 5. 在后端服务器,接收到上传图片后,可以进行相关处理,例如保存到服务器的指定位置、修改数据库等。 6. 后端处理完成后,可以返回给前端相应的结果,例如上传成功或失败的提示信息,前端可以根据返回的结果来进行后续的操作。 需要注意的是,开发者在实现图片上传功能的过程,还可以对图片进行压缩裁剪等处理,以减少图片大小和提高上传速度。同时,还要注意保障用户隐私和用户体验,例如不要上传敏感信息和大量图片等,并在上传过程给予用户足够的提示与反馈。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值