WebP vs AVIF vs JPEG:2026 图片格式怎么选(带实测数据)

悦目图库

我的流量报表里有组数字一直很扎眼:每个月 60% 的流量都是图片,图片里 90% 都是 JPEG。如果每张图小 40%,一个月能省下多少带宽费?答案是让我连夜查资料的数字。

这篇文章就是我查完资料、做完实测之后的结论。数据分两种:权威来源(MDN、caniuse)和我自己跑的实测(同一张照片,三种格式,四个质量档,一毫秒一毫秒计时)。不拍脑袋,全部摆数据。

三种格式的家谱:为什么 JPEG 该退休了

先认识一下这三个家伙。

JPEG,1992 年出生。 三十多年前为模拟照片时代设计的格式。用的是有损压缩里的 DCT(离散余弦变换)——把图像切成 8×8 的小块,丢掉人眼不敏感的高频细节。设计目标是"看着差不多就行",当年做到了,今天看就是两个硬伤:不支持透明(一张带透明背景的图,JPEG 只能给你白底);有损痕迹明显(低质量下那种方格子伪影,放大就露馅)。

WebP,2010 年 Google 出品。 从 VP8 视频编码里借来的技术,比 JPEG 年轻一代。同样是有损,但压缩算法更聪明:支持透明通道(代替 PNG 的活)、支持动画(代替 GIF 的活)、压缩率比 JPEG 高 25%~35%(MDN 数据)——同质量下,WebP 就是比 JPEG 小三分之一。

AVIF,2019 年由开放媒体联盟(AOMedia)推出。 从 AV1 视频编码里派生,是最年轻也最激进的格式。压缩率比 JPEG 高约 50%,比 WebP 再省 20% 左右(MDN 引用的对比数据),还支持 HDR、10-bit 色深、透明、动画。听着是完美答案?别急,后面有两个大坑。

测试照片:同一张 2000×1500 实拍照片

上面这张是我做测试用的实拍照片(2000×1500)。下面所有数据都是拿它跑出来的,不是编的。

实测一:同质量下,三种格式各多大

我用 Python + Pillow 把这张照片分别编码成 JPEG / WebP / AVIF,各跑了四个质量档(q40 / q60 / q80 / q100),记录体积:

质量档 JPEG WebP AVIF
q40 170 KB 94 KB 69 KB
q60 277 KB 129 KB 168 KB
q80 320 KB 195 KB 266 KB
q100 930 KB 606 KB 1116 KB

实测柱状图

看图说话,三个结论:

第一,WebP 在中高质量区间(q60~q80)最省。 q60 时 WebP 是 129KB,JPEG 是 277KB——直接省 53%,而视觉上几乎分不出区别。这个区间是网页图片的主战场(缩略图、列表图、文章配图都在这个质量范围),所以 WebP 是大多数场景的最优解。

第二,AVIF 在低质量区间(q40)极致小。 69KB,比 JPEG 的 170KB 小 59%。如果你有大量"只展示、不细看"的图(比如瀑布流的占位缩略图),AVIF 能压到离谱的小。

第三,AVIF 的 q 参数和 JPEG/WebP 不是一回事。 注意 q100:AVIF 1116KB,比 JPEG 的 930KB 还大。这不是 AVIF 差,是它的质量参数语义完全不同——同 q 值不能直接横向比,AVIF 的高质量档追求的是"无损级保真",体积自然爆炸。所以选型时别拿 q 值当统一标尺,要看"目标体积 + 视觉验收"。

质量-体积曲线

把四个质量档连成折线更直观:三者的体积都随质量上升,但 WebP 的曲线整体压在 JPEG 下方(省),AVIF 在低质量区最低、高质量区反而翘起来。选格式不是选"哪个格式好",是选"哪个格式在你的质量区间最划算"。

实测二:同样 q80,肉眼看得出区别吗?

数据归数据,我还是怕"压缩后没法看"。所以我把 q80 的三张图都导了出来,尺寸一样(600px),你直接看:

JPEG q80 46KB

WebP q80 29KB

AVIF q80 40KB

同质量档下:JPEG 46KB、WebP 29KB、AVIF 40KB。放大看局部,WebP 和 JPEG 的差异要靠仔细找——树叶的纹理 WebP 略锐,JPEG 在天空过渡带有一点点色带;AVIF 在这个质量档反而没占到便宜(q 语义问题,前面说过)。结论很实在:网页上 99% 的场景,WebP q80 的观感 ≈ JPEG q80,但体积省 37%。这 37% 累计到一个月,就是实打实的带宽钱和首屏速度。

兼容性:97.3% vs 93.5%,别忽略那 6%

数据再好看,浏览器不支持全是白搭。查了 caniuse 2026 年 8 月的全球数据:

兼容性对比

93.5% 看着挺高,但那 6.5% 里可能就有你的目标用户——比如还在用旧 iOS、某些国产浏览器内置内核、或者公司网络环境里的旧浏览器。图片显示不出来,比图片大 30% 严重得多。

所以正确的做法不是"选一个格式全站换",而是<picture> 元素做多格式回退

<picture>
  <source type="image/avif" srcset="photo.avif" />
  <source type="image/webp" srcset="photo.webp" />
  <img src="photo.jpg" alt="照片" />
</picture>

浏览器按顺序选第一个能解码的格式:支持 AVIF 的用 AVIF,不支持的退回 WebP,再不行用 JPEG。渐进增强的教科书写法——支持的浏览器享受最小体积,老浏览器兜底能看。如果你用 Vite/Vue,这种写法配合构建插件可以自动生成三套图,零手工。

这里还有个进阶玩法:CDN 内容协商。很多 CDN(Cloudinary、Cloudflare Images、腾讯云数据万象)支持 Accept 头协商——浏览器发请求时带上 Accept: image/avif,image/webp,CDN 根据请求头自动返回对应格式,前端只需要一个 URL,格式分发完全交给 CDN。源图存一份,各格式按需生成。适合流量大、不想维护 <picture> 标签的团队。缺点是多一层 CDN 依赖,回源没协商时要注意兜底。<picture> 标签和 CDN 协商二选一就行,别两个都上——那等于给浏览器发了三份格式的 URL,反而绕。

编码速度:AVIF/WebP 的隐藏成本

体积省了,但编码呢?我顺手记了三种格式的编码耗时(PIL 实测,同一张照片,毫秒级):

编码耗时

这个数字意味着什么?如果你在浏览器端实时把用户上传的图片转 WebP/AVIF,用户要等半秒甚至更久——上传体验直接崩。所以行业标准做法是预生成:图片上传到服务器/对象存储后,后台异步生成各格式各尺寸的派生图,用户列表里拿到的永远是现成的缩略图。

这个项目就是这么干的。上传走 COS(腾讯云对象存储),一条命令搞定派生:

// COS imageMogr2:缩到 1024px 内 + 转 WebP + 控质量
String rule = String.format(
  "imageMogr2/thumbnail/1024x1024>/format/webp/quality/%d", quality);

8MB 的原图,上传后 COS 异步生成一张 128KB 的 WebP 缩略图,存进 thumbnailUrl 字段,列表页全加载缩略图——懒加载 + 缩略图 + WebP 三件套(上篇写过),首屏体积直接降两个数量级。用户上传的时候完全无感,因为编码发生在后台,不在他的等待时间里。

渐进式渲染:一个容易被忽略的体验细节

JPEG 有个 WebP/AVIF 都没有的特性:渐进式渲染(progressive)。渐进式 JPEG 加载时会先显示一张模糊的全图,再逐步变清晰——用户感觉"图在慢慢变清楚",心理上更快。

WebP 和 AVIF 目前都不支持渐进式。大图(比如详情页的原图)用 WebP/AVIF,用户会看到"整块图突然跳出来"——加载完成前是一片空白,加载完成后整张弹出。在慢网络上,这个差异很直观:渐进式 JPEG 前三秒能看出"图的内容",WebP/AVIF 前三秒只有白块。

所以我的建议是分场景:列表图/缩略图用 WebP(体积小、加载快,白块时间短),大图原图可以继续用渐进式 JPEG(保留渐进体验),或者接受 WebP 的"弹跳"换 50% 流量。没有完美格式,只有按场景的取舍

选型结论:一张表搞定

做了这么多实测,最后给一张可以直接抄的选型表:

场景 推荐格式 理由
照片/缩略图/列表图 WebP q60~80 区间比 JPEG 省 40~50%,兼容 97.3%
低质量海量图(瀑布流缩略) AVIF q40 极致小,省 59%
图标/Logo/插画 SVG 矢量无限缩放,比位图小几十倍
截图(文字/UI) WebP lossless 无损 WebP 比 PNG 小 26%(MDN)
详情页大图 JPEG 渐进 或 WebP 前者有渐进体验,后者省一半流量,二选一
透明背景 WebP JPEG 不支持透明,WebP 无损支持
动图 WebP 动图 / AVIF 动图 比 GIF 小得多,还支持透明

<picture> 做回退,让老浏览器兜底 JPEG——兼容性交给标签,体积交给格式

踩坑记录

三个坑,都是我实际踩过的:

第一,别在浏览器端实时转格式。 我一开始图省事,用 Canvas 把用户上传的图在浏览器转 WebP——结果一张 8MB 的图转完要两秒,用户以为卡死了。后来改成 COS 预生成,用户上传完立刻能用,后端异步慢慢转。编码这种事,别让用户等。

第二,AVIF 的 q 值坑。 上线 AVIF 时我直接照搬了 WebP 的 q80,结果图比预期大一大截。查了才知道 AVIF 的 q 参数映射到不同的量化策略,必须按目标体积反推质量,或者用工具(如 Squoosh)可视化调。换格式 = 重新调参,不是改个后缀。

第三,别忘了那 6%。 全站切 WebP 后,有用户反馈图片裂了——一查,用的是老 Safari。<picture> 回退加上就再没出过事。格式再先进,也要给最后 6% 的用户留条路。

收尾

回到开头那个问题:你的图片该用什么格式?

如果让我用一句话总结:默认 WebP,海量低质图用 AVIF,图标用 SVG,大图看你要流量还是要渐进体验。JPEG 不是不能用,是"能用"和"划算"之间差着 40% 的流量——对图片站来说,这 40% 可能就是一半的带宽预算。

这些结论不是我拍脑袋,是这张 2000×1500 的照片在 Pillow 里跑了四组质量档、记了一堆毫秒数、外加 MDN 和 caniuse 的数据,才敢写出来。选格式这事,别信感觉,信数据。 你的站点跑一次同样的测试,五分钟就能知道该不该换。

数据在手,说换就换

最后补一句实在话:格式选型没有银弹。你的图片是照片多还是截图多、用户是老浏览器多还是新浏览器多、首屏要的是体积还是渐进体验——答案都不一样。数据 + 场景 + 回退方案,这三样凑齐了,格式怎么选都是对的。