微信小程序:canvas实现图片压缩

故事背景
卤煮项目中有OCR证件识别的需求,像这种前端向后台发送图片的操作,我们这边肯定是要把图片压缩一下再传给后台的,比如卤煮MI 10 pro拍一张要10兆起步,这上传起来还不要了老命啦~~看网上大佬都说微信自带的wx.compressImage不是很好用,所以咱就直接用canvas进行压缩吧!!!!!!
强烈建议:主要跳转画布大小和压缩质量,不然给你压个20KB???

需求实现

1.首先我们需要一个canvas画布,记得把它设置在某个隐秘的角落~~

<canvas canvas-id='photo_canvas' style='position:fixed;left: 9999px;width:500px;height:{{ canvasHeight }}px' class='myCanvas'></canvas>

2.卤煮的图片,支持拍照和相册读取图片,直接上代码

拍照:

takePhoto() {
  var that = this;
  const ctx = wx.createCameraContext();
  ctx.takePhoto({
    success: (res) => {
      console.log(res);
      that.setData({ temporaryImg: res.tempImagePath });
      that.compressImage(res.tempImagePath, (res1) => {  // 压缩方法
        that.setData({ temporaryImg: res1 });
      });
    }
  })
},

相册选取:

// 选择照片
chooseimg(){
  var that = this;
  wx.chooseImage({
    count: 1, // 默认9  
    sizeType: ['original'], // 因为下面走压缩了,这里就原图上传
    sourceType:['album'], // 可以指定来源是相册还是相机,默认二者都有  
    success:(res)=> {
      that.compressImage(res.tempFilePaths[0], (res1) => { // 压缩方法
        that.setData({ temporaryImg: res1 });
        that.uploadImg(); // 上传后台的方法
      });
    },
  })
},

canvas压缩:

// 压缩图片
compressImage(path, callback) {
  var that = this;
  //获取图片信息
  wx.getImageInfo({
    src: path,
    success: function (res) {
      var ctx = wx.createCanvasContext('photo_canvas'); // 创建画布
      var towidth = 500;  //设置canvas尺寸,按宽度500px的比例压缩
      var toheight = Math.trunc(500*res.height/res.width);  //根据图片比例换算出图片高度
      that.setData({ canvasHeight: toheight });
      ctx.drawImage(path, 0, 0, res.width, res.height, 0, 0, towidth, toheight);
      ctx.draw(false, function () {
        wx.canvasToTempFilePath({
          canvasId: 'photo_canvas',
          fileType:"jpg",
          quality: 0.8, // 注意你的压缩质量,卤煮真的压缩出20KB的,图片整个都是糊的
          success: function (res) {
            console.log(res.tempFilePath);
            callback(res.tempFilePath);
          }
        }, this)
      })
    }
  });
},

是的,canvas压缩就是如此简单!!!!!!
canvas能做的还很多,可惜卤煮没咋接触过,去学习啦!!!!!!
欢迎大佬踢馆,共同进步~

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图片压缩微信小程序中是一个很常见的需求,下面是一个简单的图片压缩的全过程: 1. 用户选择图片并上传到服务器,服务器返回图片的 URL。 2. 在小程序中,通过 wx.getImageInfo() 方法获取图片信息,包括图片的宽、高等属性。 3. 使用 canvas 绘制图片,并调用 canvas.toDataURL() 方法将图片转换成 base64 编码的字符串。 4. 将 base64 字符串发送到服务器,服务器将其转换成图片并进行压缩处理。 5. 服务器将压缩后的图片返回给小程序,并将其显示在页面上。 下面是一个代码示例: ``` // 选择图片并上传到服务器 wx.chooseImage({ success: function(res) { var tempFilePaths = res.tempFilePaths; wx.uploadFile({ url: 'your server url', filePath: tempFilePaths[0], name: 'file', success: function(res){ var imageUrl = res.data; // 服务器返回的图片 URL // 获取图片信息 wx.getImageInfo({ src: imageUrl, success: function(res){ var canvasWidth = res.width, // 图片宽度 canvasHeight = res.height; // 图片高度 // 绘制图片到 canvas var context = wx.createCanvasContext('canvas'); context.drawImage(imageUrl, 0, 0, canvasWidth, canvasHeight); context.draw(false, function(){ // 将 canvas 图片转换成 base64 编码的字符串 wx.canvasToTempFilePath({ canvasId: 'canvas', success: function(res){ var base64Data = res.tempFilePath.replace(/^data:image\/\w+;base64,/, ''); // 发送 base64 字符串到服务器进行压缩 wx.request({ url: 'your server url', data: { imageData: base64Data }, method: 'POST', success: function(res){ var compressedImageUrl = res.data; // 压缩后的图片 URL // 在页面上显示压缩后的图片 wx.previewImage({ urls: [compressedImageUrl], }); } }); } }); }); } }); } }) } }); ``` 注意,以上代码仅供参考,具体实现方式可能因应用场景不同而有所差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值