图片格式转换详解:选对格式比压参数更重要
格式转换的本质
图片格式转换看似是”另存为”,底层是解码 → 内存位图 → 重新编码的过程:先把原格式解码成内存里的像素矩阵(位图),再用目标格式的编码方式重新压缩存储。
关键认知:转换发生在位图这一中间层。所以格式转换的可行性、是否有损,取决于两种格式各自的特性,而不是简单的”互转”。理解每种格式存的是什么,你才能预判转换的结果。
各格式的本质特性
JPEG(有损)
- 压缩方式:DCT + 量化(详见 [[image-compress]])
- 有损,每次保存都丢信息
- 不支持透明(背景只能是纯色)
- 不支持动画
- 适合:照片、自然图像
- 24 位色(1677 万色),无调色板限制
PNG(无损)
- 压缩方式:DEFLATE + 预测滤波
- 无损,可反复保存不丢信息
- 支持透明(8 位 alpha 通道)
- 不支持动画(APNG 是扩展)
- 适合:图标、Logo、文字截图、需透明的图
- 支持 8 位(256 色调色板)和 24/32 位真彩
WebP(有损+无损二合一)
- 同一格式容器支持有损和无损两种模式
- 支持透明、支持动画
- 有损比 JPEG 小,无损比 PNG 小
- 适合:现代网页的通用格式
- 注意:有损 WebP 带透明时,透明边缘可能有色染问题
GIF(无损但限色)
- 无损压缩,但只有 256 色(调色板限制)
- 支持透明(但只有 1 位 alpha——像素要么全透要么不透,无半透明)
- 支持动画(这是它至今没死的原因)
- 适合:简单动画、色块图。照片用 GIF 会因 256 色限制出现明显色阶
BMP(无压缩位图)
- 几乎不压缩,原始像素矩阵直接存
- 体积巨大(一张 1000 万像素图约 30MB)
- 支持透明(少见)
- 现在基本不用,仅在需要原始未处理像素时有用
- Windows 系统原生格式
转换的方向性:哪些可逆,哪些不可逆
理解了特性,转换的方向性就清楚了:
无损 → 无损(PNG↔BMP↔WebP无损)
完全可逆,像素一比一保留。PNG 转 BMP 再转回 PNG,结果和原图一致。这类转换无信息损失。
无损 → 有损(PNG→JPEG)
不可逆。JPEG 会量化丢信息,转完后再转回 PNG 也找不回丢失的细节。而且如果原图有透明通道,转 JPEG 时透明会丢失(通常被填成白底或黑底)。
有损 → 无损(JPEG→PNG)
不恢复画质。JPEG 解码出的位图本来就已经丢过信息了,存成 PNG 只是”无损地保存了已经损失的图像”,体积反而比 JPEG 大很多。这个转换除了”需要透明”或”要继续编辑避免代际损失”,通常没意义。
有损 → 有损(JPEG→WebP有损)
再次有损,叠加损失。但如果只转一次且参数合理,损失可忽略,体积却能显著下降——这是把老 JPEG 资产迁移到 WebP 的常见操作。
涉及调色板限制(任意→GIF)
转 GIF 会强制降到 256 色,彩色照片会出现明显色阶/抖动。这是 GIF 格式的硬限制,不可逆(颜色信息直接丢弃)。
透明通道的坑
透明是格式转换的高频问题:
- PNG/WebP → JPEG:透明丢失。需要先填一个背景色(白/黑/自定义),否则透明区会变成不可预期的颜色
- PNG → GIF:8 位 alpha 降级成 1 位,半透明像素要么变全透要么变不透,边缘锯齿明显
- JPEG → PNG:JPEG 本就没透明,转出来也不可能有透明
所以”带透明”的图,目标格式必须支持透明(PNG/WebP/GIF),否则要先决定背景色处理策略。
动画的坑
- GIF → 其他:GIF 动画转 PNG/JPEG 只保留第一帧,动画丢失。要保动画得转 WebP 或 APNG
- WebP 动画 → GIF:可能因 256 色限制画质下降
- 转换工具是否支持多帧/动画是关键能力,简单的”逐帧解码”实现会丢动画
颜色深度和 ICC 配置文件
- 8 位调色板(PNG-8/GIF):最多 256 色,转换到真彩格式能保留这 256 色,但不会凭空多出颜色
- 16 位/通道:少数格式支持高色深,转到 8 位格式会降精度
- ICC 配置文件:图片可能内嵌色彩管理配置(sRGB/Display P3)。转换时是否保留 ICC 影响跨设备颜色一致性,低端转换器会丢弃 ICC 导致颜色偏移
实战决策
转换不是目的,是手段。常见诉求和正确做法:
| 需求 | 做法 |
|---|---|
| 照片瘦身 | JPEG→WebP 有损,或直接调低 JPEG 质量 |
| 图标要透明 | 保持 PNG 或转 WebP 无损 |
| 老图批量上 WebP | JPEG/PNG → WebP(注意透明处理) |
| 做动画 | 用 WebP 或 GIF(简单色块),别用多张 JPEG |
| 要原始无损像素 | BMP/PNG 无损,别过 JPEG |
小结
格式转换是”解码到位图再重新编码”,是否有损取决于目标格式特性。核心规律:无损转无损可逆,无损转有损不可逆,有损转无损不恢复画质只增大体积,转 GIF 强制降 256 色。透明和动画是两个最容易在转换中丢失的属性,务必确认目标格式支持。选对格式本身就是最大的优化——一张本该用 JPEG 的照片用 PNG 存,再怎么压参数也压不过格式转换。压缩原理详见 [[image-compress]],Base64 内嵌见 [[image-base64]]。