JPG 格式是如何工作的 *通过人类感知理解图像压缩*
Source: Dev.to
看起来您只提供了来源链接,而没有提供需要翻译的正文内容。请把您想要翻译的文本粘贴在这里,我会帮您翻译成简体中文,并保留原有的格式、Markdown 语法以及代码块和 URL。
Source: …
为什么 JPG 表现如此出色
Joint Photographic Experts Group (JPG) 格式于 1992 年推出,其核心理念非常简单:
人眼对亮度的变化比对颜色的变化更敏感。
现代相机传感器捕获的信息远超人眼能够感知的范围。JPG 压缩正是利用了这一区别,在显著减小文件体积的同时,保持感知上的图像质量。
JPG 压缩的核心步骤
-
颜色空间转换
- 图像通常以 RGB(红、绿、蓝)存储。
- JPG 将 RGB 转换为 YCbCr,将亮度与颜色分离:
- Y → 亮度(Luminance)
- Cb → 蓝色差分(Blue chroma)
- Cr → 红色差分(Red chroma)
这种分离使得算法能够对颜色数据进行更激进的压缩,而保留人眼最敏感的亮度信息。
-
块划分
- 将图像划分为若干小块,通常为 8 × 8 像素。
- 每块可以独立压缩,并可根据局部细节程度采用不同的压缩强度。
- 过度压缩会产生可见的块状伪影。
-
离散余弦变换 (DCT)
- 对每块进行基于余弦的变换,将像素值转换为 频率分量。
- 低频 → 平滑区域(非常重要)
- 高频 → 细节纹理(不太显眼)
这一步为后续的高效降采样做好准备。
-
量化(有损阶段)
- 降低精度,尤其是高频颜色数据。
- 丢弃人眼不易察觉的信息。
- 按 之字形(zig‑zag) 顺序遍历系数,以优先保留重要数值。
- 这是 JPG 压缩唯一真正的有损阶段,也正因如此,反复保存 JPG 会导致质量逐渐下降。
-
熵编码与重建
- 将压缩后的数据进行熵编码,打包成
.jpg文件。 - 解码时,数据被转换回 RGB。
- 最终得到的图像对我们而言“看起来相同”,但实际数据量大幅减少。
- 将压缩后的数据进行熵编码,打包成
块大小与量化的影响
| 影响 | 较小的块 | 较大的块 |
|---|---|---|
| 细节 | 细节保留更好,文件更大 | 压缩率更高,可能出现可见伪影 |
| 典型结果 | 更好地保留细腻纹理 | 在高压缩率下出现明显块状感 |
实际使用中,JPG 可以舍弃 约 75 % 的颜色细节,而几乎不影响亮度信息——这对照片而言是极佳的折中方案。
JPG 与 PNG – 快速比较
| 特性 | JPG | PNG |
|---|---|---|
| 压缩 | 有损 | 无损 |
| 透明度 | ❌ 否 | ✅ 是 |
| 最佳用途 | 照片 | 用户界面、标志、文字 |
| 典型文件大小 | 较小 | 较大 |
PNG 变体
| 变体 | 颜色深度 | 透明度 | 典型用途 |
|---|---|---|---|
| PNG‑8 | 受限调色板(256 种颜色) | 单色透明 | 简易图形、图标 |
| PNG‑32 | 数百万种颜色 | 真透明(全范围) | 用户界面元素、高质量图形 |
颜色模型:基于光 vs. 基于墨水
| 模型 | 组件 | 解释 |
|---|---|---|
| RGB(基于光) | 红色, 绿色, 蓝色 | 黑色 = 无光, 白色 = 完全强度 |
| CMYK(基于墨水) | 青色, 洋红, 黄色, 黑色 | 用于印刷;需要从 RGB 进行颜色转换 |
因为 JPG/PNG 是面向屏幕的格式,它们 不是印刷原生。要进行专业输出,需要转换为印刷就绪的颜色空间(例如 CMYK)。
选择合适的格式
| 用例 | 推荐格式 |
|---|---|
| 📸 摄影 | JPG |
| 🎨 UI / 标志 / 透明度 | PNG |
| 🌐 对带宽敏感的应用 | JPG |
| 🖨️ 专业打印 | 转换为打印原生格式(例如 TIFF、PDF 或 CMYK 编码的 PNG) |
了解 JPG 的工作原理可以让你真正掌控质量、性能和存储——不仅仅是导出对话框中的一个滑块。
Discussion
你在项目中注意到 JPG 与 PNG 的质量差异吗?你更倾向使用哪种格式——为什么?