前端图片上传前压缩处理

通过减小宽高、大小等方式来达到压缩图片,图片压缩后dpi会改变
通过:before-upload来拦截图片上传,压缩完后再返回Promise,继续上传

IE不支持的写法:

// 转成file对象
const _files = new FormData();
_files.append("file", res, res.name);
const resFiles = _files.get("file");//ie不支持.get方法
// ie不支持new File写法
const file = new File([u8arr], fileName, {
  type: type,
});
Promise

页面代码

<el-upload
            style="text-align: center"
            list-type="picture-card"
            class="upload-demo"
            accept=".png,.jpg"
            :action="uploadFile.action"
            :before-upload="beforeUpload"
            :multiple="false"
            :file-list="item.fileList"
          >
            <div class="uploadBox">
              <i class="el-icon-plus"></i>
            </div>
          </el-upload>

1.通过Compressor插件

地址:插件文档
下载插件

npm i compressorjs --save

使用

import Compressor from 'compressorjs'

beforeUpload(file) {
      console.log(file,22221111);
      return new Promise((resolve) => {
          new Compressor(file, {
            quality: 0.3,//推荐为0.6,
            success(result) {
              //result为 Blob格式数据
              console.log(result,1212);
              resolve(result);
              //将Blob数据转成base64格式
        	//const reader = new FileReader();
        	//reader.readAsDataURL(result);
        	//reader.onload = () => {
        		//console.log(reader.result,1111);
        	//};
            },
            error(err) {
              console.log(err.message);
            },
          });
        });
    },

2.通过canvas

compressImg.js文件

// 将base64转file
function base64ToFile(base64, fileName) {
  // 将base64将前缀与后续内容分隔开
  let data = base64.split(",");
  // 获取图片的类型(image/png、image/jpeg、image/webp等)
  let type = data[0].match(/:(.*?);/)[1];
  // 使用atob()对base64数据进行解码,结果是一个文件数据流 以字符串的格式输出
  const bstr = window.atob(data[1]);
  // 获取解码结果字符串的长度
  let n = bstr.length;
  // 根据解码结果字符串的长度创建一个等长的整形数字数组
  // 所有元素初始值均为 0
  const u8arr = new Uint8Array(n);
  // 将整形数组的每个元素填充为解码结果字符串对应位置字符的UTF-16 编码单元
  while (n--) {
    // charCodeAt():获取给定索引处字符对应的 UTF-16 代码单元
    u8arr[n] = bstr.charCodeAt(n);
  }
  // 创建File文件对象
  const file = new File([u8arr], fileName, {
    type: type,
  });
  return file;
}
//压缩图片处理
export function compressImg(file) {
  let files;
  let fileSize = file.size / 1024;
  let read = new FileReader();
  read.readAsDataURL(file);
  return new Promise(function(resolve, reject) {
    read.onload = function(e) {
      let img = new Image();
      img.src = e.target.result;
      img.onload = function() {
        //生成canvas
        let canvas = document.createElement("canvas");
        let ctx = canvas.getContext("2d");
        let base64;
        // 创建属性节点
        canvas.setAttribute("width", img.width);
        canvas.setAttribute("height", img.height);
        ctx.drawImage(img, 0, 0, img.width, img.height);
        //如果图片小于500kb,压缩到原始的0.5
        // canvas.toDataURL返回的是base64格式
        if (fileSize < 500) {
          base64 = canvas.toDataURL(file["type"], 0.5);
        } else {
          //如果图片超过500kb 压缩到原始的0.2
          base64 = canvas.toDataURL(file["type"], 0.2);
        }
        // base64获取file对象
        files = base64ToFile(base64, file.name); //如果后台接收类型为base64的话这一步可以省略
        resolve(files);
      };
    };
  });
}
import { compressImg } from "../util/compressImg";

beforeUpload(file) {
      	console.log(file,22221111)
       return new Promise((resolve) => {
         compressImg(file).then((res) => {
           console.log(res,123123);
           resolve(res);
         });
       });
    },

3.通过image-conversion插件

下载插件

npm i image-conversion --save

使用

import * as imageConversion from 'image-conversion'

beforeUpload(file) {
      	console.log(file,22221111)
       return new Promise((resolve) => {
          imageConversion
            .compressAccurately(file, 100)//设置为100kb左右
            .then((res) => {
              // res为Blob格式
              console.log(res,111122);
              //保留原始文件名
              let files = new File([res], file.name, { type: file.type });
              console.log(files);
              resolve(files);
            });
        });
    },
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前端 JavaScript 中,可以使用 HTML5 的 File API 获取上传的图片文件,然后使用 Canvas 对图片进行压缩处理,最后将压缩后的图片上传至服务器。以下是一个简单的示例代码: ```javascript // 获取上传的图片文件 var fileInput = document.getElementById('fileInput'); var file = fileInput.files[0]; // 创建一个 Image 对象 var img = new Image(); // 加载图片文件 img.onload = function() { // 创建 Canvas 元素 var canvas = document.createElement('canvas'); // 设置 Canvas 的宽高 var maxWidth = 800; var maxHeight = 800; var width = img.width; var height = img.height; if (width > height) { if (width > maxWidth) { height *= maxWidth / width; width = maxWidth; } } else { if (height > maxHeight) { width *= maxHeight / height; height = maxHeight; } } canvas.width = width; canvas.height = height; // 在 Canvas 上绘制压缩后的图片 var ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, width, height); // 将压缩后的图片转换为 Base64 编码的字符串 var base64 = canvas.toDataURL('image/jpeg', 0.8); // 将 Base64 编码的字符串上传至服务器 // ... }; // 读取图片文件的内容,并设置 Image 对象的 src 属性 var reader = new FileReader(); reader.onload = function(event) { img.src = event.target.result; }; reader.readAsDataURL(file); ``` 在上述代码中,我们使用 Canvas 对图片进行了压缩处理,并将压缩后的图片转换为 Base64 编码的字符串,然后可以将该字符串上传至服务器。需要注意的是,压缩后的图片质量会有所损失,因此可以根据实际需求调整压缩比例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值