news 2026/10/29 7:07:09

纯前端图片压缩神器 Compressor.js

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
纯前端图片压缩神器 Compressor.js

点赞 + 关注 + 收藏 = 学会了

本文简介

现在大部分网站都会有图片,不管这个图片是用来展示的,还是需要上传到服务器的。

但图片的体积往往比文字大,会占用更多的服务器空间,也会消耗用户更多的流量。所以在适当范围内压缩一下图片是很有必要的。

今天介绍一款纯前端的图片压缩工具:compressor.js。

虽然这是一款有损的图片压缩工具,但压缩质量还是挺不错的,尤其是它可以在前端运行,对于要上传图片到服务器的业务,可以考虑一下用 compressor.js。

你也可以用 Compressor.js 做个图片压缩的工具网站,用户多了就开个百度或者谷歌的广告,也能赚点奶茶钱。

先体验一下 compressor.js 的效果:https://fengyuanchen.github.io/compressorjs/

这是 compressor.js 的代码仓库:https://github.com/fengyuanchen/compressorjs

动手试试

安装 compressor

npm

npm 通过这条命令安装。

npm install compressorjs

然后在需要使用到 compressor.js 的页面中引入。

importCompressorfrom'compressorjs';

CDN

如果你不使用打包工具,也可以直接通过 CDN 在 HTML 中引入 Compressor.js。

<script src="https://cdn.jsdelivr.net/npm/compressorjs@latest/dist/compressor.min.js"></script>

基础用法

要使用 compressor.js 压缩图片,首先通过new Compressor创建一个压缩实例,并传入文件和一些配置参数。成功后会返回一个压缩后的图片对象。

接下来我用一个小例子演示一下。这个例子通过上传一张图片,然后使用 compressor 压缩它,再返回一个下载链接。

<!-- 文件上传控件 --><inputtype="file"id="fileInput"accept="image/*"><!-- 下载压缩后的图片 --><divid="downloadLink"><aid="downloadCompressed"style="display:none;"download>点击下载压缩后的图片</a></div><!-- 引入 Compressor.js --><scriptsrc="https://cdn.jsdelivr.net/npm/compressorjs@latest/dist/compressor.min.js"></script><script>// 获取 file input 和下载链接元素constfileInput=document.getElementById('fileInput')constdownloadCompressed=document.getElementById('downloadCompressed')// 当文件选择发生变化时触发fileInput.addEventListener('change',function(event){constfile=event.target.files[0]// 获取上传的文件if(!file){return// 如果没有选择文件,则不继续执行}// 使用 Compressor.js 压缩图片newCompressor(file,{success(result){downloadCompressed.href=URL.createObjectURL(result)// 显示下载链接downloadCompressed.style.display='inline'},error(err){console.error('压缩失败:',err)},})})</script>

在这个例子中,使用了<input type="file">作为上传图片的元素,获取到用户上传的图片后,使用new Compressor(file[, options])来压缩图片,new Compressor接收2个参数,第一个参数是图片文件,第二个参数是一系列参数,在本例中的所有参数都使用了默认值。最后通过success()处理压缩成功后的操作,用error()处理压缩失败后的操作。

当压缩成功后就进入success(result)里了,这里的result返回了压缩成功后的图片对象,通过URL.createObjectURL(result)的方式将返回压缩成功后的图片地址。将该地址赋值到<a>标签里就能给用户手动点击下载了。

挺简单吧~

配置压缩强度

在前面的例子中,我们通过new Compressor(file[, options])压缩图片,但压缩的强度默认是 80%,在压缩 JPG 时默认是 92%。如果你希望将图片体积压缩得更小(画质会更差),可以在options这个参数里配置一项quality。quality接收的值是0~1,quality的数值越小压缩出来的图片体积就越小,压缩力度就越大。

具体用法:

// 省略部分代码newCompressor(file,{quality:0.6,// 设置压缩质量为 60%success(result){},// 压缩成功后执行这里的代码error(err){}// 压缩失败后执行这里的代码})

设置下载文件的文件名

在前面的例子中,我们下载压缩成功后的图片,文件名看上去是一堆乱码。

比如,我想将压缩后的图片名改成在原图的文件名后面拼上“-德育处主任”,可以这么做。

// 省略部分代码newCompressor(file,{quality:0.6,// 设置压缩质量为 60%success(result){// 获取文件名,并给压缩后的文件加上 "-德育处主任" 后缀constoriginalName=file.name;constextensionIndex=originalName.lastIndexOf('.');constnameWithoutExtension=originalName.substring(0,extensionIndex);constextension=originalName.substring(extensionIndex);downloadCompressed.download=nameWithoutExtension+'-德育处主任'+extension;downloadCompressed.href=URL.createObjectURL(result)// 显示下载链接downloadCompressed.style.display='inline'},error(err){console.error('压缩失败:',err)}})

压缩网络图片

compressor.js 的第一个参数必须是一个File对象(通常是通过文件上传获取的),它不支持直接传入网络图片的 URL。因为它需要操作的是一个本地的File或Blob对象,而不是通过 URL 获取的资源。

但我们可以先通过 JavaScript 将网络图片转换为一个File或Blob对象,然后再将其传递给 compressor.js。

我上传了一张图片到免费的图床上(这是将我公众号的url转成艺术二维码的图片): https://i.imgur.com/zyurGlf_d.webp?maxwidth=760&fidelity=grand

functionurlToBlob(url){returnfetch(url).then((response)=>response.blob()).then((blob)=>{// Step 2: 将 Blob 传递给 Compressor.jsnewCompressor(blob,{quality:0.8,// 设置压缩质量success(result){console.log('压缩后的图片:',result)},error(err){console.error('压缩出错:',err)},})})}constimageUrl='https://i.imgur.com/zyurGlf_d.webp?maxwidth=760&fidelity=grand'urlToBlob(imageUrl)

通过fetch读取这张图片,然后将读取回来的图片执行.blob()方法将其转换成blob再丢给 compressor.js 压缩。

纯前端用 compressor.js 压缩图片,能省服务器空间和流量,还能自定义压缩质量。落地时要考虑工程效率,不妨看看RollCode 低代码平台的私有化部署、自定义组件、静态页面发布(SSG + SEO)能力。


以上就是本文的内容啦,如果你想在线体验一下 compressor.js 的压缩能力,可以试试这个网站 http://worklite.vip/

点赞 + 关注 + 收藏 = 学会了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 12:04:30

学术 PPT 还在 “论文缩写”?虎贲等考 AI PPT:10 分钟生成逻辑 + 颜值双在线的答辩神器

“把论文复制粘贴到 PPT&#xff0c;被导师批‘像在读文献’”“熬夜调图表格式&#xff0c;答辩时却发现数据标注漏了显著性”“汇报超时被打断&#xff0c;核心创新点根本没来得及说”—— 做学术 PPT&#xff0c;从来不是 “文字搬家” 那么简单。尤其面对开题答辩、科研汇报…

作者头像 李华
网站建设 2026/10/27 3:40:55

留言板表情系统技术实现:从代码输入到直观显示的演进

引言 你好呀&#xff0c;我是小邹。 表情符号在现代网络交流中扮演着重要角色。最初&#xff0c;我的博客留言板使用[:表情名称:]的文本格式&#xff0c;但这种方式存在用户体验不佳的问题。通过技术重构&#xff0c;实现了在输入框中直接显示表情图片的"所见即所得&quo…

作者头像 李华
网站建设 2026/10/25 7:42:00

LabVIEW上位机Demo获取ABB设备日志、信息、速度与状态的综合展示

LabVIEW获取ABB的日志、设备信息、速度、状态。 一个abb上位机的Demo&#xff0c;使用的是适合工程人员的LabVIEW语言。 38直接撸起袖子开干&#xff01;今天咱们聊聊怎么用LabVIEW薅ABB设备的羊毛——哦不&#xff0c;是正经获取设备数据。搞过自动化项目的都知道&#xff0c;…

作者头像 李华
网站建设 2026/10/23 5:42:37

Vue技术——JavaScript 数据代理的实现与应用

Vue 中的“数据代理”&#xff08;Data Proxy&#xff09;实现与应用详解 在 Vue&#xff08;尤其是 Vue 2&#xff09;中&#xff0c;数据代理 和 数据劫持/响应式 是两个密切相关但又不同的概念。很多人把它们混在一起&#xff0c;今天我们彻底拆开来讲清楚。 1. 什么是“数…

作者头像 李华
网站建设 2026/10/25 10:38:43

必收藏|小白/程序员转行大模型全攻略,从零入门不踩坑

大模型作为当下AI领域的核心热点&#xff0c;已成为程序员转型进阶、小白入行AI的首选方向。很多人想切入却无从下手&#xff0c;要么不清楚自己适合哪个赛道&#xff0c;要么被繁杂的知识体系吓退。今天这份超详细转型攻略&#xff0c;专为小白和程序员量身打造&#xff0c;从…

作者头像 李华