前端实现图片压缩—压缩图片大小,画质(两种方式)

这篇博客介绍了两种使用canvas压缩图片的方法。第一种方法根据图片的宽高比和指定的最大宽高来调整图片尺寸,然后设置默认的图片质量。第二种方法则直接基于画质压缩图片,允许指定压缩质量。在调用这些方法时,会先检查文件类型和大小,确保上传的图片符合要求。最后,压缩后的图片将被转换为blob格式。
摘要由CSDN通过智能技术生成

方法1:压缩图片–根据 宽 高 画质压缩图片

在这里插入图片描述

  /* 图片压缩方法-canvas压缩  压缩图片--根据 宽 高 画质压缩图片*/
    compressUpload(file, config) {
      let read = new FileReader();
      read.readAsDataURL(file);
      const fileName = file.name;
      return new Promise((resolve, reject) => {
        // 生成canvas
        let canvas = document.createElement("canvas");
        let ctx = canvas.getContext("2d");
        let _this = this;
        read.onload = function (e) {
          let img = new Image();
          img.src = e.target.result;
          img.onload = function () {
            let w = this.width;
            let h = this.height;
            let scale = w / h;
            w = config.width || config.height * scale || w;
            h = config.height || config.width / scale || h;
            // 最大宽高如有限制时的处理
            w = config.maxWidth && w > config.maxWidth ? config.maxWidth : w;
            h = config.maxHeight && h > config.maxHeight ? config.maxHeight : h;
            w = Math.min(w, h * scale) || w;
            h = Math.min(h, w / scale) || h;

            let quality = 0.7; // 默认图片质量
            // 创建属性节点
            let anw = document.createAttribute("width");
            anw.nodeValue = w;
            let anh = document.createAttribute("height");
            anh.nodeValue = h;
            canvas.setAttributeNode(anw);
            canvas.setAttributeNode(anh);
            ctx.drawImage(this, 0, 0, w, h);
            if (config.quality && config.quality <= 1 && config.quality > 0) {
              quality = config.quality;
            }
            let base64 = canvas.toDataURL("image/jpeg", quality);
            // 回调函数返回base64的值,也可根据自己的需求转换
            resolve(base64);
            canvas = null;
          };
        };
      });
    },

方法二:压缩图片–根据画质压缩图片

在这里插入图片描述

    /* 图片压缩方法-canvas压缩  根据画质压缩图片 */
compressUpload(image, file, quality) {
  let canvas = document.createElement("canvas");
  let ctx = canvas.getContext("2d");
  let { width } = image,
    { height } = image;
  canvas.width = width;
  canvas.height = height;
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  ctx.drawImage(image, 0, 0, width, height);
  let base64 = canvas.toDataURL(file.type || "image/jpeg", quality);
  // 压缩后调用方法进行base64转Blob,方法写在下边
  return  base64;
  canvas = null;
},

方法调用

 <el-upload
   ref="upload"
   class="avatar-uploader"
   action="https://jsonplaceholder.typicode.com/posts/"
   :before-upload="beforeUpload"
   :auto-upload="false"
   accept=".jpg,.png,.jpeg"
   :on-change="handleChange"
 >
   <!-- <img v-if="imageUrl1" class="avatar-uploader-icon" :src="imageUrl1" alt="" /> -->
  <i class="el-icon-plus avatar-uploader-icon"></i>
beforeUpload(file) {
      console.log("压缩前:", file);
      let _this = this;
      const isIMG = file.type == "image/jpeg" || file.type == "image/png" || file.type == "image/jpg";
      const isLt2M = file.size / 1024 / 1024 < 5;
      if (!isIMG) {
        this.$message.error("上传图片只能是 .jpg/.png/.jpeg 格式!");
      }
      if (!isLt2M) {
        this.$message.error("上传文件大小不能超过 5MB!");
      }
      return new Promise((resolve, reject) => {
        let isLt2M = file.size / 1024 / 1024 < 10; // 判定图片大小是否小于10MB
        if (!(isLt2M && isIMG)) {
          reject();
        }
        let image = new Image(),
          resultBlob = "";
        image.src = URL.createObjectURL(file);

        image.onload = () => {
          // 调用方法获取blob格式,方法写在下边   以下方法二选一:
          resultBlob = _this.compressUpload(file, this.form);
          resultBlob = _this.compressUpload(image, file, this.form.quality);
          resolve(resultBlob);
        };
        image.onerror = () => {
          reject();
        };
      });
},
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值