首页 > 其他分享 >结合 element -Plus组件库,压缩图片大小,限制图片格式

结合 element -Plus组件库,压缩图片大小,限制图片格式

时间:2023-12-29 18:23:35浏览次数:35  
标签:canvas const 图片格式 element Plus file image 压缩 图片

业务背景:业务上需求满足上传的图片不能太大,但是有时候上传的图片确实超过了限制大小,所以前端这边可以将图片压缩再上传,
亦或者是上传给后端接口的图片只能是指定格式,我们前端需要将图片后缀转化,也可以处理!封装的使用方法如下:

使用 canvas 对图片进行压缩处理:

/*

  * 压缩图片

  * param  file: 接受的文件对象

  * param  option: 图片压缩的参数  具体可以看一下 canvas的官网介绍 :https://www.canvasapi.cn/HTMLCanvasElement/toDataURL


 */

export function compressPic(
  file: any,
  option?: {
    maxWidth?: number;
    maxHeight?: number;
    minSize?: number;
    mimeType?: string;
    quality?: number;
  }
): any {
  const maxWidth = option?.maxWidth || 750; // 最大宽度
  const maxHeight = option?.maxHeight || 750; // 最大高度
  const minSize = option?.minSize ?? 300 * 1024; // 最小压缩文件大小 300kb
  const mimeType = option?.mimeType || "image/jpeg"; // 默认图片类型
  let qualitys: number = option?.quality || 0.8; // 默认压缩阙值0.75
  // 根据文件大小设置不同的默认压缩质量
  if (parseInt((file.size / 1024).toFixed(2)) < 1024) {
    qualitys = 0.85;
  }
  if (5 * 1024 < parseInt((file.size / 1024).toFixed(2))) {
    qualitys = 0.92;
  }

  // 如果上传的是多个文件,递归处理每个文件
  if (file[0]) {
    return Promise.all(
      Array.from(file).map((e: any) => compressPic(e, option))
    );
  } else {
    return new Promise((resolve) => {
    // 这里我注释了是因为我们没有这个需求,如果有这个需求的可以将这个注释放开就可以了 // // 如果图片大小小于300KB,直接返回原始图片数据 // if (file.size < minSize) { // resolve({ // file: file, // }); // } else { // 创建FileReader对象,异步读取存储在客户端上的文件内容 const reader: FileReader = new FileReader(); // 读取操作完成时触发该事件,使用格式(必须将接收到的数据从onload发送到其他函数):reader.onload = e => {} reader.onload = ({ target }: ProgressEvent<FileReader>) => { // console.log("target----", target); //创建img元素 const image = new Image() as any; // 图片加载完成后异步执行,当image的src发生改变,浏览器就会跑去加载这个src里的资源,这个操作是异步的。 image.onload = async () => { // 创建一个新的画布元素和上下文,用于绘制压缩后的图片 const canvas = document.createElement("canvas"); const context = canvas.getContext("2d") as any; // 计算目标图片的宽度和高度,以适应最大宽度和高度的要求 let targetWidth = image.width; let targetHeight = image.height; // 缩放图片尺寸以适应最大宽度和高度 if (targetWidth > maxWidth || targetHeight > maxHeight) { const scaleFactor = Math.min( maxWidth / targetWidth, maxHeight / targetHeight ); targetWidth *= scaleFactor; targetHeight *= scaleFactor; } // 设置画布的尺寸 canvas.width = targetWidth; canvas.height = targetHeight; // 清空画布并在画布上绘制压缩后的图片 context.clearRect(0, 0, targetWidth, targetHeight); context.drawImage(image, 0, 0, targetWidth, targetHeight); // 将压缩后的图片数据转换为 data URI。可以使用 type 参数其类型,默认为 PNG 格式。qualitys越小,文件体积越小 const canvasURL = canvas.toDataURL(mimeType, qualitys); // 解码 data URI,获取图片的二进制数据。atob:是ascii to binary,用于将ascii码解析成binary数据,即Base64的解码过程。 const buffer = atob(canvasURL.split(",")[1]); let length = buffer.length; //创建一个 Uint8Array 类型的向量,用于存储图片的二进制数据 const bufferArray = new Uint8Array(new ArrayBuffer(length)); while (length--) { bufferArray[length] = buffer.charCodeAt(length); } // 创建一个压缩后的文件对象 const miniFile = new File([bufferArray], file.name, { type: mimeType, }); // 解析压缩后的文件对象 resolve({ uid: file.uid, raw: miniFile, origin: file, beforeSrc: target?.result, afterSrc: canvasURL, beforeKB: Number((file.size / 1024).toFixed(2)), afterKB: Number((miniFile.size / 1024).toFixed(2)), }); }; // 设置图片的 src,触发图片加载 image.src = target?.result; }; // 读取文件内容,并在读取完成后触发 onl oad 事件 reader.readAsDataURL(file); // } }); } }

页面使用:
1、组件中引入封装的方法

 2、在页面中直接使用方法就 OK,传入一个文件对象,不传第二个值就是默认值

 

标签:canvas,const,图片格式,element,Plus,file,image,压缩,图片
From: https://www.cnblogs.com/leng12/p/17935492.html

相关文章

  • MISBoot全新版本发布预告:Element Vue3版即将上线,敬请期待!
    旧岁将辞新岁临,时光匆匆又一年。2024新年马上来临,我们怀揣着满满的热忱,即将为您带来MISBoot低代码开发平台全新版本,这次全新版本将引领未来趋势,将Vue3与ElementPlus完美融合,为您提供更强大、更灵活且更高效的开发体验。在快速变化的技术世界中,低代码开发已成为企业信息化的必然选......
  • 摸鱼摸出来的vue3+element-plus毒蘑菇后台管理:新标签页的实现。
    在浏览器中,点击标签页右边的加号可以新加一个标签页,所以,在毒蘑菇后台管理(简称毒蘑菇儿)中也可以这样操作。点击标签页右边的+按钮就可以打开一个新标签页了,可以打开多个,互不冲突,在新标签页中可以搜索你想要打开的页面,点击后会将该标签页替换成你点击后的页面(跟浏览器操作一致)。点......
  • 自己写的mapper.xml如何使用mybatis-plus的自带分页?
    在MyBatis-Plus中,使用自带的分页功能非常简单。首先,确保你的mapper.xml文件中定义了需要的SQL语句,并在相应的mapper接口中使用IPage类型的参数进行分页。接下来,使用Page类来包装查询条件,并调用Mapper接口的分页方法。首先,假设你的mapper.xml中有类似如下的查询语句:<!--在mapper.xm......
  • Mybatis-Plus 常用注解总结
    在框架的使用中,注解约定大于配置,我们可以轻松通过注解完成很多工作,比如字段改名映射,插入更新的时间写入等,下面的学习内容主要列举了常用的注解。我们看看官网中列出的注解有哪些[1]:本文的注解学习主要内容集中在以下的注解中:@TableName@TableId@TableField@EnumValue@Ver......
  • Java Spring Boot Mybatis-Plus 的简单使用
    此文主要基于官网case整理,如需了解更多详情,请移步官网。环境:SpringBoot:3.1.6JDK:17MySQL:5.7数据准备主要是MySQL建库建表,插入一些数据。建库:CREATEDATABASEmybatis_demo;建表:DROPTABLEIFEXISTS`user`;CREATETABLE`user`(idBIGINTNOTNULLCOMME......
  • D. Split Plus K
    原题链接什么时候无解?有解计算code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lla[200005]={0};intmain(){llt;cin>>t;while(t--){lln,k;cin>>n>>k;llzs=0,fs=0;f......
  • 使用Element.animate()实现动画
    Element.animate()实现<divid="app"><button@click="startAmi">开始</button><p>{{msg}}</p></div><scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><s......
  • 使用java8 将pdf转为tif文件并设定图片格式
    在工作中,遇到一个需要将pdf转为tif并将图片大小限制到30kb以内的需求。在网上看了一圈,也因为依赖版本等等踩了一些坑,为此记录下来学习的过程。`importcom.github.jaiimageio.impl.plugins.tiff.TIFFImageWriterSpi;importcom.github.jaiimageio.plugins.tiff.BaselineTIFFTagS......
  • OnePlus 6 体验 Mobian 折腾记录
    1.刷入Mobian解BL锁等操作在此不赘述。1.1.下载刷机包进入Mobian镜像下载页,找到SDM845,进入weekly目录,下载最新构建的刷机包;1.2.刷入系统①将手机重启至fastboot模式,连接到电脑;②解压,在电脑上打开终端,依次输入:fastbootflashboot解压出来的boot镜像的路......
  • 香橙派5plus从ssd启动Ubuntu
    官方接口图我实际会用到的就几个接口,背面的话就一个M.2固态的位置:其中WIFI模块的接口应该也可以插2230的固态,不过是pcie2.0的速度,背面的接口则是pcie3.0*4的速度,差距还是挺大的。开始安装系统准备工作一张内存卡(如果买的时候没有emmc的话)下载并安装balenaEtcher一个m.......