
做前端开发或者日常做项目的朋友,应该都碰到过图片太大的问题。现在手机拍的照片分辨率巨高,随便一张就好几兆,如果直接上传后台,不仅用户上传慢、占用服务器储存,接口还容易超时。之前我一直用网上的压缩工具,要么一堆广告,要么强制上传图片,心里总觉得不踏实,生怕隐私图片被泄露。后来才发现,完全可以在浏览器本地实现图片压缩,不用传服务器,也不用装软件,体验真的好太多。
很多人不知道,浏览器其实自带了很强的图片压缩处理能力。我们平时说的前端图片压缩,核心就是通过 Canvas 重绘图片,再重新导出低体积的新图片。而且最实用的一点是,它支持两种压缩模式:一种是按画质比例压缩,另一种是按目标体积压缩,能根据场景自由切换,实用性直接拉满。
先简单唠唠这两种压缩逻辑。按质量压缩应该是大家最熟的,就是通过调节图片质量参数,从 0.1 到 1 之间自由调整。数值越低,图片越糊、体积越小,反之画质就越清晰。这种方式胜在简单稳定,几乎不会出 bug,适合大部分普通场景。但它有个小缺点,就是没法精准控制最终文件大小,你调同一个参数,大图和小图压缩出来的体积差很多,有时候压完还是偏大,白忙活一场。
所以更高级、也更贴合业务需求的,是按目标体积压缩。比如我就需要图片压缩到 500KB 以内,不管原图多大,程序自动反复调整画质参数,迭代压缩,直到文件体积达标为止。很多现成工具做的都很粗糙,压缩好几次画质崩的厉害,其实是迭代逻辑没写好,稍微优化下算法就能避免这个问题,完全可以做到体积达标、画质不翻车。
整个前端压缩的实现原理其实不复杂,我简单说下流程:
File API 读取用户上传的图片文件,获取图片原始宽高和文件大小。相比于后端压缩和在线网页压缩,浏览器本地压缩的优势真的很明显:
不过它也有一点小局限,浏览器压缩属于有损压缩,过度压缩还是会出现噪点、模糊的情况。而且部分超大分辨率图片,一次性绘制可能会有渲染异常,需要做分片处理或者限制最大尺寸。但日常业务场景,比如头像上传、截图提交、素材上传,这套方案完全够用,一点问题没有。
总的来说,浏览器实现可控的图片压缩,是一个特别实用的前端小技能。既能按画质快速压缩,也能精准控制目标体积,适配绝大多数业务需求。代码不复杂、维护成本低、用户体验还好,现在我做项目基本都会集成这个功能,彻底告别第三方压缩工具,真心推荐大家试试。

图片工具: 图片格式化 图片转PDF 图片转GIF 图片压缩