在 redesign 工具站首页时,我也写下这篇技术记事,记录主打工具「智能图片压缩器」的诞生过程。目标只有一个:把原始图片体积压到 30% 以下,同时肉眼几乎看不出差异。为此我选择 WebAssembly + Rust 的组合,让压缩逻辑在浏览器本地完成,无需上传服务器,既安全又快。
为什么是浏览器端压缩?
- 用户不必把私密素材交给第三方;
- 利用本地硬件(尤其是 Apple M 系列)速度极快;
- 不依赖后端 API,可嵌入任何静态站或独立工具。
但浏览器端也有限制:内存管理更严格、要兼容 Safari/Chrome,还需要良好的 UI 引导。于是我把工具拆成三层:
wasm-core:Rust 编写的压缩内核并导出 wasm。worker:使用 Web Worker 处理大文件,避免阻塞 UI。ui:React + Tailwind 打造的交互层,负责拖拽、预览、批量下载。
实现细节
文件加载
const file = await blob.arrayBuffer();
const result = await worker.compress({ buffer: file, quality: 0.75 });
用户上传后立即转换为 ArrayBuffer 交给 Worker,由 Worker 与 wasm 交互,全程不阻塞主线程。
压缩策略
- 默认使用 MozJPEG;遇到透明 PNG 时切换 OxiPNG。
- 根据 histogram 判断图片复杂度,动态调整质量区间。
- 对体积 < 200KB 的图片避免过度压缩,只做无损优化。
交互体验
- 拖拽 / 点击上传,实时列出文件名、原始大小、压缩结果;
- 提供对比滑块查看细节差异;
- 支持批量一键下载压缩后的 zip。
性能结果
在 M3 Pro 的测试中:5 张共 24MB 的图片仅用 2.1 秒压缩完成,最终体积 6.3MB,平均节省 73%,体验几乎无等待。
如何集成到其他项目
工具以 npm 包形式发布,也提供 iframe 嵌入版,只需:
import { ImageCompressor } from '@xingjian/tools';
export default function Page() {
return <ImageCompressor theme="magazine" />;
}
未来还会补充批处理 CLI、更灵活的画质控制甚至「对比分析报告」。欢迎访问工具集页面体验,也欢迎提出想法。希望这篇中文文章能成为前端图片压缩实践的一个参考案例。