小程序压缩图片先用canvas进行压缩,压缩后再用微信api

我们在小程序上,直接上传手机相册及拍照的图片时,因为图片过大(如10m),手机端不像我们再计算机上传输那么快,也没那么稳定,

解决办法:在图片上传前压缩图片

压缩图片就是将图片尺寸、图片质量降低,把这两个指数降低到合适的规格

1.首先在 wxml 文件中创建一个画布canvas

注意:画布的定位,将它定位到我们看不见的地方 position: absolute; left:-8000px;top:-8000px; ,因为图片压缩不需要展示到我们手机屏幕上,大概意思如下图:
2.就是js处理部分了
思路是:wx的api 调用相册或拍照,获取图片的size,判断size大小,如果超过1M就需要压缩,没有超过1M那么就不需要压缩
压缩,即将图片尺寸等比减小,并将质量逐步降低,在循环中减小到你觉得合适的尺寸和质量,然后从画布中取出图片,上传到后端服务器中即可
具体代码如下:
upAvatar: function () {
var that = this;
wx.chooseImage({
count: 1,
sizeType: [‘original’, ‘compressed’],
sourceType: [‘album’, ‘camera’],
success(res) {
wx.showLoading({
title: ‘头像上传中’,
mask: true,
});
var size = res.tempFiles[0][‘size’];
if (size > 1048579) { //如果图片大于1M就要进行压缩处理
//获取图片信息
wx.getImageInfo({
src: res.tempFilePaths[0],
success: function (rr) {
var ctx = wx.createCanvasContext(‘attendCanvasId’);
var ratio = 1;
var canvasWidth = rr.width
var canvasHeight = rr.height;

          var quality = 0.6;  //图片质量
          while (canvasWidth > 3000 || canvasHeight > 3000) {
            //比例取整
            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: canvasHeight
          });
          ctx.drawImage(res.tempFilePaths[0], 0, 0, canvasWidth, canvasHeight);  //将图片填充在canvas上
          ctx.draw();

          //下载canvas图片
          setTimeout(function () {
            wx.canvasToTempFilePath({
              canvasId: 'attendCanvasId',
              width: 0,
              height: 0,
              destWidth: canvasWidth,
              destHeight: canvasHeight,
              fileType: 'jpg',
              quality: quality,
              success: function success(path) {
                //这里是将图片上传到服务器中
                that.upAvatar(path.tempFilePath, that); 
              },
              fail: function fail(e) {
                wx.hideLoading();
                wx.showToast({
                  title: '头像上传失败',
                  icon: 'success',
                  duration: 2000
                });
              }
            });
          }, 1000);
        }
      });
    } else {  //小于1M的就不用压缩了
      that.upAvatar(res.tempFilePaths[0], that); //上传图片到服务器
    }
  }
})

},

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用以下代码来压缩图片到指定大小: ```javascript /** * 压缩图片到指定大小 * @param {string} src - 图片路径 * @param {number} maxSize - 压缩后最大文件大小,单位为 KB * @returns {Promise<string>} - 返回 Promise 对象,resolve 后返回压缩后的图片路径 */ function compressImage(src, maxSize) { return new Promise((resolve, reject) => { wx.getImageInfo({ src, success(res) { const { width, height, path } = res; const quality = 0.9; // 初始压缩质量 const MAX_WIDTH = 800; // 压缩后最大宽度 const MAX_HEIGHT = 600; // 压缩后最大高度 const canvas = wx.createCanvasContext('compress-canvas'); // 如果图片尺寸小于等于最大尺寸,则不需要压缩 if (width <= MAX_WIDTH && height <= MAX_HEIGHT) { resolve(path); return; } // 计算压缩比例 let ratio = Math.min(MAX_WIDTH / width, MAX_HEIGHT / height); let targetWidth = width * ratio; let targetHeight = height * ratio; // 设置 canvas 宽高 canvas.canvas.width = targetWidth; canvas.canvas.height = targetHeight; // 绘制图片canvas canvas.drawImage(path, 0, 0, targetWidth, targetHeight); function compress() { // 将 canvas 转为图片路径 wx.canvasToTempFilePath({ canvasId: 'compress-canvas', quality, success(res) { // 判断图片文件大小是否小于等于最大文件大小 wx.getFileSystemManager().readFile({ filePath: res.tempFilePath, success(res) { const fileSize = res.data.byteLength / 1024; // 文件大小,单位为 KB if (fileSize <= maxSize) { resolve(res.filePath); } else { // 文件大小大于最大文件大小,继续压缩 quality -= 0.1; compress(); } }, fail(e) { reject(e); } }); }, fail(e) { reject(e); } }); } // 开始压缩 compress(); }, fail(e) { reject(e); } }); }); } ``` 在上面的代码中,我们使用了 `wx.getImageInfo()` 获取图片信息,然后根据图片尺寸和最大尺寸计算出压缩比例,将图片绘制到 canvas 上,再将 canvas 转为图片进行压缩。在压缩过程中,我们不断调整压缩质量,直到文件大小小于等于最大文件大小为止。最后返回压缩后的图片路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故事只若初见

坚持就是胜利

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值