HEIC 转 JPG 怎么不掉画质
先给结论:JPEG 是有损格式,「无损转 JPG」在定义上做不到——每一次 JPEG 编码都在丢信息。但你可以做到肉眼完全看不出来,这在绝大多数用途下就等于无损。这一页讲清损失从哪来、参数怎么设,以及什么情况下该干脆改用 PNG。
「无损转 JPG」是个做不到的目标
先把最容易误解的一点说清:JPEG 是一种有损压缩格式,这是格式定义本身决定的,和用哪个工具无关。它的流程是先把图像切成 8×8 的小块做离散余弦变换,再对变换后的系数做量化——量化这一步就是不可逆的信息丢弃。
所以任何宣称「无损 HEIC 转 JPG」的说法,只可能是两种情况之一:要么是营销话术,要么它说的其实是「视觉无损」。
数学意义上的真无损,只有一个办法:转成无损格式。PNG、TIFF,以及 WebP 的无损模式都能做到逐像素一致。代价是体积——照片转成 PNG 通常会变成原来的 3~5 倍。
但对绝大多数人来说,真正要解决的问题不是「能不能绝对无损」,而是「损失到什么程度,眼睛看不出来」。下面就从这里开始。
转一次,到底丢了什么
把 HEIC 转成 JPG,损失来自四个方向,其中只有一个是「画质」。
一是二次编码。HEIC 本身已经是有损压过一次的结果,转 JPG 等于在它基础上再压一次。这种叠加损失叫代数损失,是换格式最主要的代价。
二是量化强度。JPEG 的质量参数直接控制量化表——参数越低,丢弃的细节越多。这是你唯一能直接拧的旋钮。
三是色度二次采样。JPEG 常用 4:2:0 采样,色度信息的分辨率被减半。人眼对亮度敏感、对色度不敏感,所以多数照片看不出问题;但彩色细线、红色小字这类内容会明显变糊。
四是元数据与色彩管理。如果转换链条上有一端忽略了 ICC 描述文件,颜色会整体偏移——这不是压缩损失,而是色彩损失,看起来比压缩糊更刺眼。EXIF 里的拍摄时间、GPS,以及方向标记也可能在这一步被丢掉。
参数怎么设才不掉画质
我们用本站自己的转换管线,对两张真实照片在五个质量档位上跑了实测,量出体积和 PSNR(峰值信噪比,越高越接近原图):
| JPG 质量 | 样本 A 体积 | 样本 A PSNR | 样本 B 体积 | 样本 B PSNR |
|---|---|---|---|---|
| 60% | 516.4 KB | 41.8 dB | 610.9 KB | 39.2 dB |
| 70% | 569.3 KB | 45.7 dB | 683.1 KB | 44.3 dB |
| 80% | 620.1 KB | 47.2 dB | 740.2 KB | 45.7 dB |
| 90% | 718.5 KB | 49.3 dB | 866.6 KB | 47.7 dB |
| 100% | 2265.1 KB | 59.3 dB | 2961.5 KB | 57.6 dB |
读表的关键在最后两行。从 90% 提到 100%,体积涨了约 3 倍,PSNR 也涨了 10 dB——但 PSNR 一旦超过 45 dB 左右,肉眼就已经分辨不出差别了。多出来的体积买到的只是数字。
所以追求「不掉画质」的答案是 90%:它在两个样本上都进入 47 dB 以上,属于肉眼无差别的区间,体积却只有 100% 的三分之一。完整的实测方法和数据可以在 HEIC 转 JPG 画质实测里看到,也欢迎直接引用。
除了质量参数,还有三条同样重要:
- 不要缩放。只要动了分辨率,像素就被重采样了,这和压缩是两回事,损失更明显。
- 不要反复转。每转一次都是一次新的有损编码,损失会累积。原图留着,只转一次。
- 不要在链条里塞中间格式。「HEIC → PNG → JPG」比「HEIC → JPG」多一步,却并不会更好:PNG 这一步既不增加信息,又多出文件。
什么时候该改用 PNG
如果你的目标真是「一个像素都不能变」,那就不该转 JPG,应该转 PNG。以下三种情况属于这一类:
- 需要透明通道。JPEG 格式根本不支持 alpha 通道,这一条没有折中余地。
- 还要继续编辑或反复转存。截图、线稿、UI 素材、需要多次修改的设计稿,用 JPEG 存一次就丢一次。
- 画面是纯色块和锐利边缘。这类内容用 JPEG 存,块效应特别明显,PNG 反而体积可控。
但要记住 PNG 的代价:它对照片这类连续色调的内容几乎没有压缩能力,一张 3 MB 的照片转成 PNG 可能变成 10 MB 以上。所以这不是「更好的选择」,而是「另一种取舍」。
怎么验证自己转出来的画质
不需要仪器,两个办法就够用。
肉眼法:把图放大到 100%,看渐变区域。天空、墙面、人像的额头和脸颊这些大面积平滑过渡的地方,是压缩损失最先露馅的位置。如果那里看不出条带或色块,日常使用就没问题。
量化法:算 PSNR 和平均色差。PSNR 衡量整体像素误差,平均色差衡量颜色偏移。我们做实测用的三个脚本就在仓库的 tools/testkit/ 里:bench_make_heic.py 生成样本,bench_run_quality.js 操作真实转换页取回产物,bench_report.py 算分。整个流程是可复现的。
有一个坑值得提醒:算 PSNR 时如果用 PIL 的 Image.point 直接对差值的平方做查表,结果会被截断到 255,MSE 被系统性低估,PSNR 偏高。正确做法是逐通道按直方图精确累加。bench_report.py 为此带了 --selftest 开关。
结论
把上面几节收成一句话:不要找「无损」工具,找「看不出来」的参数。
- 日常分享、发社交、存档 —— 质量 90%,肉眼无差别,体积只有 100% 的三分之一。
- 要归档或留作后续编辑的底稿 —— 别转 JPG,保留原始 HEIC,或者转 PNG。
- 要严格控制体积 —— 70%~80%,配合适当的输出尺寸,画质仍在可用区间。
本站的转换工具支持手动调节质量参数,并且全程在浏览器本地完成——照片不会上传到任何服务器,转换的中间结果也不会离开你的设备。