# 如何将图片压缩到文件大小上限内

有人扔给你一个数字，100 KB、500 KB、2 MB，而你的照片差得老远。这一页讲的是：这个数字要你拿什么去换，该花在哪儿，以及怎么判断压完的这张还能不能发出去。

[打开图片压缩](https://httcup.github.io/tools/compress-image/): 说个大小，剩下的它来算。

最后更新 2026年10月13日

## 先说结论

打开[图片压缩](https://httcup.github.io/tools/compress-image/)，把照片丢进去，把人家给你的那个数字打进去，按按钮。它会把图编码好几遍，留下能塞进目标、又最好的那一份，并告诉你这一下花了多少。老实说，大多数照片配大多数目标，你根本看不出差别。

这一页剩下的部分，是给看得出差别的情况准备的：结果发糊了、PNG 几乎压不动，或者你想在把图发给别人之前，先弄清这个工具到底对它做了什么。

![目标卡片：填入 200 kB，旁边是常见上限的按钮、格式菜单，以及一行说明工具将要尝试什么。](https://httcup.github.io/screens/compress-an-image-to-a-target-size/target.webp)

把别人给你的数字填进去。下面的一切都是工具朝这个数字使劲，而不是你在质量滑块上瞎猜。

## 表单、附件和能读清的扫描件

**申请同时规定像素和文件大小。**先读允许的格式，用[图片缩放](https://httcup.github.io/tools/resize-image/)裁剪到所需尺寸，再在这里填字节预算，关掉“必要时可以缩小图片”。要求 JPEG 就明确选择 JPEG。成品不仅要查大小，也要查尺寸和格式；文件够小而尺寸不对仍不合格。

**一封邮件里的多张照片。**目标对每张图分别生效，按总附件预算分配单图上限。ZIP 只把结果装在一起，已压缩图片不一定还能大幅缩小。

**客服所需收据或截图。**细字重要就先试 PNG，检查下载件最小文字。过低目标可能缩到无法阅读。保留大些的副本，或先裁掉无关边框，再决定是否继续损失细节。

## 一个文件大小限制，实际上是在要什么

JPEG 和 WebP 存的不是你的照片，是对这张照片的一段描述，而质量设置决定这段描述允许有多细。调低它，文件就小，因为描述变糙了：细腻的纹理被平均掉，渐变出现色带，边缘泛起一圈淡淡的块状光晕。

大小限制就是细节预算。值得问的不是“能不能压到 500 KB 以下”，而是“要舍弃多少画面信息才能达到目标，这些损失会不会影响用途”。

两条经验。真实场景的照片，人脸、树叶、布料，很能藏住压缩痕迹，因为眼睛在里面找不到一块绝对平的地方去挑毛病。而截图、图表、logo，以及任何有大片纯色和硬边文字的东西，一压就露，这类本来就该用 PNG 或者 WebP，而不是 JPEG。

## 为什么没有公式，以及那该怎么办

没有哪个算式能算出“质量调到几才刚好出一个 500 KB 的文件”。这两者之间的关系完全取决于画面内容：同样的设置下，一张大白墙的照片可能只有一张森林照片的十分之一大。凡是丢给你一句“质量：60”然后听天由命的工具，都是在替你猜。

唯一靠得住的办法是试。编一遍，看看多大，调一调，再编一遍。手动干这事很烦，所以压缩工具才改成问你要一个质量数字，等于把这份烦琐推给了你。自动干下来大约是八次编码，而一张手机照片编八次，本世纪出的任何机器都是零点几秒的事，所以本站这个工具改成问你要大小，搜索它自己来。

它报出来的每一个大小，都是真编出来的文件，不是估算。碰上有硬性上限的表单，这一点很要紧：一个乐观了 2% 的估算，等于一次被打回来的上传。

## 先花质量，再动像素

把一个图片文件变小，只有两条路。一是把同一张画面描述得粗糙些，这是质量；二是描述更少的像素，这是缩尺寸。两者不等价，而且先后有讲究。

质量先花，因为头上大约 30% 的质量降幅，在照片上是真看不出来的，你扔掉的是格式本来存得比任何眼睛都仔细的那部分细节。像素后动，因为质量一旦降到痕迹开始露出来，那么一张尺寸小一点、画质还体面的图，就比一张全尺寸却被压烂的图好看。像素少一点但个个干净，胜过多一堆全糊了。

整套策略就这么点东西，哪怕你用的是别的工具也值得记住：把质量往下调，调到开始不对劲了，就别再往下调，改成把图做小。

### 什么时候该主动缩尺寸

有时候那些像素本来就是多余的。一张 4000 像素宽的照片，放在网页上一栏 600 像素宽的位置里，扛着的是六倍于谁能看见的细节。你要是清楚这张图最终待在哪儿，先按那个尺寸缩一下，大小问题往往就没了，一点质量都不用花。干这活的是[图片缩放](https://httcup.github.io/tools/resize-image/)，怎么挑尺寸，[它自己那篇指南](https://httcup.github.io/tools/guides/resize-an-image/)里讲了。

## 挑格式

值得知道的格式有三种，浏览器三种都能写。

- **JPEG** 是给照片用的。有损，但有史以来的东西都认得它，拍真实场景的照片用它至今仍是好选择。它存不了透明。
- **WebP** 干同样的活，干得更好：同等的、你分辨不出来的画质下，比 JPEG 小 25% 到 35% 左右，而且保得住透明。现在的浏览器都读它。少数老一点的桌面软件，还有一些公司的上传表单，仍然不认，这是不用它的唯一实在理由。
- **PNG** 是无损的，也就是又精确又大。截图、logo、线稿，以及任何有硬边或者大片纯色的东西，用它是对的；照片用它是错的。

要文件的那一方没提别的要求，那就用 WebP，同样压到目标，它留下的可见损伤比 JPEG 少。文件要送进一个老系统，或者送进一个你没法测试的系统，那 JPEG 是稳妥答案。

## 为什么你的 PNG 压不下去多少

这是最常见的意外，而且不是你手上那个工具的 bug。PNG 是无损格式，存的是一模一样的像素，也没有质量这个旋钮可拧，拧了它就成另一种格式了。PNG 压缩器能做的，只是把同样那些像素打包得更聪明些，通常也就省下百分之几。

所以，文件必须小很多、而且必须还是 PNG，那剩下的杠杆只有尺寸：像素少一点，或者颜色少一点。要是它不非得是 PNG 不可，那就得看里面装的是什么：

- **存成 PNG 的照片。**这种情况很常见，往往是误选。转换成 JPEG 或 WebP，常能缩小五到十倍而没有明显可见变化。
- **截图或图表。**试试 [PNG 转 WebP 工具](https://httcup.github.io/tools/png-to-webp/)的 Lossless 模式，并检查实际节省了多少。这个目标大小压缩器搜索的是有损 WebP，没有无损模式。JPEG 可能让文字边缘变模糊。
- **带透明的标志。**WebP 保留透明。JPEG 会填上纯色，通常不是你要的效果。

## 怎么判断压完的还能不能用

看缩略图什么都证明不了，缩略图大小下什么都挺好。有两个更靠谱的办法：

**按全尺寸看，盯着画面里最平的那块地方。**天空、皮肤、刷过漆的墙。压缩损伤最先出现在平滑的渐变里，表现为淡淡的方块或者色带，而那时细节丰富的区域还完全没事。

**工具要是给了测量值，就读一读。**这里的压缩工具会把自己压出来的结果解码回去，跟原图比对，报出 SSIM。这个数字比的是局部的明暗、对比和结构，而不是数一数多少像素变了，更接近人眼在意的东西。大约在 0.98 以上，两张图并排看已经很难分辨；低到 0.95 以下，发之前先自己看一眼。它同时也报 PSNR，就是传统的那个分贝值，给习惯看它的人。

两个数都在你自己的机器上算出来、摆给你看，而这正是它们的意义：把“质量损失很小”从一句宣称，变成一个你能核对的数字。

![一行结果：原图 1.4 MB，压缩后的副本 196 kB，达到这个大小所用的质量，以及一个对比两者的链接。](https://httcup.github.io/screens/compress-an-image-to-a-target-size/results.webp)

真正出来的东西，就摆在放进去的东西旁边。那个对比链接，是你弄清这个数字有没有让你付出看得见的代价的入口。

## 发文件之前，有三件事值得知道

**重新编码会去掉原元数据。**已低于目标的文件会原样返回，元数据也保留。需要处理的图片先解码成像素，再重新编码。画布没有原标签，所以 GPS、相机型号、时间戳等不会写入新文件。通常这是额外的好处。如果只想删除标签，不改画面，用 [EXIF 查看与清除工具](https://httcup.github.io/tools/exif-editor/)。它重写容器，不重新压缩图片。[对应指南](https://httcup.github.io/tools/guides/remove-exif-and-gps-data/)解释里面有什么。

**同一个文件绝不要压第二遍。**每一次有损编码都会永久扔掉一些细节，而对一张已经压过的图再编一次，扔掉的更多，因为它会老老实实把第一遍留下的压缩痕迹也保住，代价是真正的细节。永远回到原图，只压一次。

**留住原图。**有损编码没有回头路。不管你最后发出去的是哪一版，一开始那个文件，找个地方留着。

## 这些事一样都不用上传

浏览器自带 JPEG、PNG 和 WebP 编码器已经很多年了，那就是把画布里的图存下来时用的同一段代码。压缩图片属于那类在技术上根本没理由牵扯服务器的活，所以这里的工具也就没有服务器：解码、编码、测量都在你自己的机器上，而页面的 `Content-Security-Policy` 里，没有一个属于本站的地址可以把图送过去。

想确认这一点，不管在这儿还是在别处，最省事的办法都是：把页面打开，断开网络，照压一张试试。还能用，就说明什么都没上传。[把文件传给在线转换器安全吗？](https://httcup.github.io/tools/guides/is-it-safe-to-upload-files/)里还有另外三个同类检查。
