工具实现揭秘图片工具
图片压缩是怎么实现的
Canvas 重编码的本地压缩——为什么 60% 质量能省一半体积,为什么无损格式要换格式
TL;DR:图片压缩在浏览器里用 Canvas 重编码完成:解码你选的图片 → 画到画布 → 以 60% 质量重新编码输出。单文件 ≤20MB、批量总计 ≤200MB,多文件结果自动打包成 ZIP。全程没有上传。
⏱️ 30 秒上手
- 打开 tools.guangmin.top/tools/image_compress;
- 拖入或选择一张或多张图片(JPG/PNG/WebP);
- 每张图自动压缩,表格里直接对比压缩前后体积与节省比例;
- 单张点「下载」,多张点「打包下载 ZIP」。
🔧 它是怎么实现的
三个关键技术点:
- 压缩 = 重新编码,不是「删像素」:JPEG 等有损格式的体积大头是编码时保留的细节量。把图片解码后以更低质量参数重新编码,视觉几乎无差、体积大幅下降。本工具的压缩质量是固定 60%(常量
IMAGE_COMPRESS_QUALITY = 0.6,全站唯一事实源)——测试过的人像/截图/商品图普遍能省 40%~80% 体积; - PNG 也能压:PNG 是无损格式,重编码为 PNG 省不了多少。工具的实际策略是按目标格式重编码——对体积敏感的场景,PNG 转 WebP 输出才是大头(WebP 同画质体积约为 PNG 的三分之一)。是否改格式在解码时按文件类型与输出格式决定;
- 多文件用 shared 的 createZip 打包:批量结果在前端打成 ZIP(与「文件打包压缩」工具共用同一份 fflate 封装,见转换篇),不落服务器。
📏 边界与限制
| 项 | 值 | 说明 |
|---|---|---|
| 单文件上限 | 20MB | 超出直接提示 |
| 批量总计 | 200MB | 内存护栏,防止一次性解码爆掉浏览器 |
| 压缩质量 | 60%(固定) | 全站常量唯一事实源,不提供滑块(避免用户调出「压了等于没压」的组合) |
| 支持格式 | JPG / PNG / WebP | 输出按目标格式重编码 |
🔒 隐私口径
图片只在浏览器内存里解码、绘制、重编码,产物直接存回你的设备。服务器在这件事里的全部工作是把这个页面递给你。
🔗 延伸阅读
- 重原理的姐妹篇:儿童入园照是怎么实现的(Canvas 之上叠加本地人像分割模型)
- 批量打包的引擎:文件打包压缩