# 图片压缩 — 压缩到文件大小上限内

说个大小，剩下的它来算。

> 将 JPEG、PNG、WebP 或 AVIF 压缩到 100 KB、2 MB 等文件大小上限内。目标是达到或低于上限，并非精确匹配字节数。无需上传，可离线使用。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/compress-image/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的图片**在浏览器里处理**，无须上传处理。

压缩在你自己的浏览器里、用你自己的硬件完成，用的是浏览器本来就带的编码器。这个工具没有任何联网功能，不取东西，也不发东西。就算真有，这个页面的另一头也没有服务器能接住一张图。

- ✗ 不上传
- ✗ 不注册
- ✗ 不限大小
- ✓ 断网能用
- ✓ 开源

## 图片怎么压到指定大小

1. **选好你的图片。** 拖到下面的方框里，或者点开自己挑。浏览器直接从你的硬盘上读，这期间没有东西发出去。
2. **填上人家要求的那个大小。** 上传框死活不收你照片，那多半是 100 KB；申报系统常见 500 KB；网页要开得快，2 MB。最常用的四个数字直接做成了按钮。
3. **按“压到这个大小”。** 每张图会被反复编码几遍，工具一步步逼近那个既能塞进去、画质又最高的档位。本来就没超标的文件，原样放行，一个字节都不动。
4. **看看代价有多大，然后下载。** 每个结果都写明存成了什么格式、用了哪一档画质、尺寸有没有变，以及量出来跟原图有多接近。按“对比”，两张图并排放着看。

## 说得更细的版本

[如何将图片压缩到文件大小上限内](https://abox.tools/zh/guides/compress-an-image-to-a-target-size/): 上传框要 500 KB，你的照片有 4 MB。一个大小限制到底要你付出什么，先动哪个设置，以及 PNG 为什么不像 JPEG 那样能压。

## 工具箱里还有

- [图片缩放](https://abox.tools/zh/resize-image/): 说个尺寸，拉个框，挑个格式。
- [HEIC 转 JPG](https://abox.tools/zh/heic-to-jpg/): iPhone 拍的照片，换成什么都打得开的格式。
- [WebP 转 JPG](https://abox.tools/zh/webp-to-jpg/): 把网页保存的图片，变成所有软件仍然接受的格式。
- [PNG 转 WebP](https://abox.tools/zh/png-to-webp/): 同一张图片，常常减少三分之一体积，透明区域保持完整。

## 常见问题

### 我的图片会传到什么地方去吗？

不会。解码、压缩、测量，全由你自己的浏览器在你自己的硬件上完成，用的是浏览器自带的 JPEG、PNG 和 WebP 编码器。这个工具没有任何联网功能，不取东西，也不发东西。页面的 `Content-Security-Policy` 把它可能联的地址全列了出来，没有一个是本站的。

### 如何达到文件大小上限？

工具编码并测量多个候选结果，寻找上限内最高的画质。如果能够生成合适的文件，结果达到或低于目标，但不一定等于输入的精确字节数。已低于上限的文件保持不变。如果仅调整画质仍不够，工具会缩小尺寸；使用前请检查结果。

### 所谓“损失最小”，具体指什么？

三件很具体的事。第一，本来就没超标的图原样放行，不重新编码。第二，先花画质，后动分辨率，而且画质只降到压缩痕迹开始露出来那一档为止。再往下，工具改成把图片做小、把画质提回去，因为像素少一点但个个干净，比像素多一堆却全糊了好看。第三，一旦找到塞得进去的结果，搜索还会往回顶，把剩下的额度用满。你要 500 KB，就不会拿回一个 300 KB 的文件。

### 每个结果上的 SSIM 和 PSNR 是什么？

是这次压缩的代价，做法是把结果解码回来跟原图逐一比对。SSIM 比的是局部的明暗、对比和结构，比数一数多少像素变了更接近人眼在意的东西，大约在 0.98 以上，两张图并排看已经很难分辨。PSNR 是传统的那个分贝值。两个数都在你自己的机器上算，也都摆出来，好让“损失很小”这句话是能核对的，而不只是嘴上说说。

### 它能读、能写哪些格式？

可以读取浏览器能解码的 JPEG、PNG、WebP、GIF、BMP 和 AVIF 等图片。新编码使用 JPEG、PNG 或 WebP。已小于目标大小的文件会原样返回，保留原格式和元数据。需要编码时，自动模式先使用浏览器能输出的原格式；无法输出时，GIF 先使用 PNG，AVIF、BMP 或 MIME 类型不明的输入先使用 JPEG。随后，如果 WebP 能以更少的可见损失满足目标，自动模式可能选择 WebP。

### 为什么 PNG 压不下去多少？

因为 PNG 是无损的，根本没有画质这个旋钮可拧。想让一个 PNG 变小，只能减像素或者减颜色，所以选了 PNG，工具只能靠缩尺寸去够那个目标。图片要是照片，换 JPEG 或 WebP 能离目标近得多，而且看上去完全没问题。要是 logo 或者带透明的截图，WebP 能留住透明，换成 JPEG 那块地方会被填成白色。

### 压缩会把 EXIF 和 GPS 信息一起去掉吗？

重新编码的结果不保留原有 EXIF、GPS、时间戳等元数据，因为画布只有像素。已小于目标大小的文件会原样返回，元数据仍保留。[EXIF 查看与清除](https://abox.tools/zh/exif-editor/)可查看和编辑 JPEG、PNG 和 WebP 元数据，不重新编码图片。AVIF 支持只读查看提取到的 EXIF，清理时将第一张解码后的图片转换为新的 PNG，颜色或 HDR 可能改变。

### 免费吗？要注册吗？

免费，没有账号，不用登录，没有试用期，也没有水印。文件的数量和大小同样没有上限，因为没有哪台服务器在为它们掏钱，活是在你自己的机器上干的。本站带广告，经费就是这么来的，广告拿不到关于你图片的任何信息。

### 断网能用吗？

能。页面开一次之后断网，它照干不误。这也是证明“什么都没上传”最省事的办法。一个把图片送出去压缩的工具，拔线那一刻就停了。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这里没有任何东西会去联网取数据。** 整个 `src/` 里，一个 `fetch`、一个 `XMLHttpRequest`、一个 `sendBeacon` 都找不到。压缩这一步就是 `canvas.toBlob`，用的是你浏览器里早就装好的那个编码器。
- **那些数字是量出来的，不是报上去的。** 文件大小、画质档位、SSIM 比对，全在这个页面上算出来，也全摆给你看。这个仓库里没有哪个统计事件会带上文件名、大小、数量或者结果。
- **Google 加载了什么，又拿不到什么。** 广告脚本和统计脚本来自 Google，捐助按钮来自 Buy Me a Coffee。关于你图片的信息，一条都没给它们。读文件、压缩、测量的每一行代码都从本站发出，也都摆在仓库里。
- **断网照样能用。** 断开网络，这个工具跟原来一模一样，因为它本来就没有联网这一步。这是最省事的一条证明。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，`src/compress.js` 里是决定画质花多少的那次搜索，`src/measure.js` 里是“视觉相似度”这个数字背后的比对。
