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

使用 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;
};
// 读取文件内容,并在读取完成后触发 onload 事件
reader.readAsDataURL(file);
// }
});
}
}

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

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

结合 element -Plus组件库,压缩图片大小,限制图片格式的更多相关文章

  1. 转-android图片降低图片大小保持图片清晰的方法

    http://i.cnblogs.com/EditPosts.aspx?opt=1 android里面对于图片的处理一直是个比较烦人的问题,烦人之处在于一个不小心,就有可能造成OOM. 最近碰到一个关 ...

  2. 16款优秀的Vue UI组件库推荐

    16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基 ...

  3. [转载]前端——实用UI组件库

    https://www.cnblogs.com/xuepei/p/7920888.html Angular UI 组件 ngx-bootstrap 是一套Bootstrap 组件 官网:https:/ ...

  4. java关于图片处理修改图片大小

    最近做了一个关于图片浏览的内容.因为图片都是一些证件的资料的扫描件所以比较大,对系统的影响也是非常之大的,有很大可能直接把系统干死.那么我是这么处理的,给大家分享一下.如果大家有好的方案的话一定要早点 ...

  5. 强烈推荐优秀的Vue UI组件库

    Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正 ...

  6. Vue UI组件库

    1. iView UI组件库  iView官网:https://www.iviewui.com/ 2.Vux UI组件库   Vux官网:https://vux.li/ 3.Element UI组件库 ...

  7. ui组件库

    基于Vue的Quasar Framework 中文网 http://www.quasarchs.com/ quasarframework/quasar: Quasar Frameworkhttps:/ ...

  8. 【转】优秀的Vue UI组件库

    原文来源:https://www.leixuesong.com/3342 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司 ...

  9. [转]使用 Angular CLI 和 ng-packagr 构建一个标准的 Angular 组件库

    使用 Angular CLI 构建 Angular 应用程序是最方便的方式之一. 项目目标 现在,我们一起创建一个简单的组件库. 首先,我们需要创建一个 header 组件.这没什么特别的,当然接下来 ...

  10. Python脚本:删除文件夹下的重复图片,实现图片去重

    近期在整理相册的时候,发现相册中有许多重复图片,人工一张张筛查删除太枯燥,便写下这个脚本,用于删除文件夹下重复的图片. 第一部分:判断两张图片是否相同 要查找重复的图片,必然绕不开判断两张图片是否相同 ...

随机推荐

  1. JS深入学习笔记 - 第三章.变量作用域与内存

    1.原始值和引用值 ECMScript变量包含两种不同类型是数据:原始值和引用值. 原始值:最简单的数据.有6中原始值:Undefined.Null.Boolean.Number.String和Sym ...

  2. 算法打卡|Day2 数组part02

    Day2 数组part02 今日任务:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 目录 Day2 数组part02 今日任务:977.有序数组的平方 ,209.长度最小的 ...

  3. Dubbo源码浅析(一)—RPC框架与Dubbo

    一.什么是RPC 1.1 RPC概念 RPC,Remote Procedure Call 即远程过程调用,与之相对的是本地服务调用,即LPC(Local Procedure Call).本地服务调用比 ...

  4. 树莓派3B/3B+的串口使用

    树莓派包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0).硬件串口由硬件实现,有单独的波特率时钟源,性能高.可靠.mini串口时钟源是由CPU ...

  5. 使用ensp搭建路由拓扑,并使用isis协议实现网络互通实操

    转载请注明出处: 1.通过拓扑搭建如下拓扑: 其中R7.R8为L1,R6为L1/2,R9为L2. 2.配置isis实现网络互通 R7配置如下: [Huawei]isis 1 [Huawei-isis- ...

  6. matlab启动时的路径警告

    前段时间在做HDLCoder时为方便修改设置加了一条路径在搜索路径目录,后来把路径名称修改了,文件夹也删掉了,换句话说就是路径不存在了,然后在matlab的setpath对话框里边也把该目录删除了. ...

  7. 推荐免费的svn空间(SVN代码托管)

    推荐免费的svn空间(SVN代码托管) 最近研究了国内和国外的免费svn空间,SVN代码托管,SVN在线,代码托管中心,有所心得. 1.http://www.svn999.com/ [推荐]国内的,免 ...

  8. 用阿里云镜像Centos7通过rpm和源码编译方式安装MySQL5版本

    这里只说明安装和注意事项,更具体的配置如端口号.cnf文件配置等就不写了. 阿里云开源镜像站资源目录 (aliyun.com) 我用的是基础版本. 基础版本镜像是默认不联网的,可以用下面的命令ping ...

  9. 各种flex布局,拿来即用用过的都说好

    开发过程中,很多布局,用antd的栅格还是不灵活,flex弹性布局会更好用 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 注意 ...

  10. 请教shell读写XML问题

    请教shell读写XML问题 现有 123.xml文件,内容是:<?xml version="1.0" encoding="GBK"?><vi ...