图片优化是交付问题,不是一条压缩命令。正确的输出取决于图片内容、实际渲染尺寸、设备像素比、网络、解码器、色彩要求、无障碍需求,以及图片是否是页面的最大内容绘制(LCP)元素。文件更小并不一定代表回归减少:如果图片模糊、解码成本过高、请求优先级错误或尺寸不匹配,用户体验仍可能变差。
核心要点
- 从真实显示插槽出发生成衍生尺寸,不要把大型主图发送给所有设备。
- 按内容类型和交付约束选择格式。JPEG、PNG、WebP、AVIF、SVG、GIF 与视频有不同的失败模式。
- 不要懒加载可能成为 LCP 的首屏图片;应预留布局空间、明确请求优先级,并只对非关键的首屏下内容懒加载。
- 用
srcset、sizes和<picture>明确候选图与艺术指导;回退格式也必须适用于浏览器之外的客户端。 - 在代表性设备上比较字节数、视觉质量、解码时间、LCP、CLS 和长任务行为。质量数字不是通用标准。
- 把无障碍、色彩配置、授权、EXIF 隐私和源文件溯源纳入流水线,而不是事后补救。
“优化”到底意味着什么
优化后的图片应满足明确的视觉和交付预算。预算可能包括最大字节数、最低感知质量、目标解码时间、色彩策略、无障碍要求,以及缓存或留存政策。没有注明样本集、编码器、参数、基线、设备、网络和测量方法,就不能声称固定百分比的通用收益。
性能数据也需要上下文。Core Web Vitals 面向真实用户体验分布,不是保证每个页面或图片都在某个固定时间内完成加载的承诺。实验室工具适合定位问题,真实用户监测则用于理解不同设备、网络和版本的分布及回归。
先从实际渲染插槽开始
源文件尺寸应根据最大的有效渲染插槽决定,而不是默认沿用相机或设计导出的尺寸。例如,插槽宽度为 640 CSS 像素、设备像素比为 2 时,接近 1280 物理像素的候选图可能合理;这不是所有视口或缩放场景的规则。
应记录:
- 渲染宽高,以及艺术指导导致的宽高比变化;
- 设备像素比候选和有意义的最大分辨率;
- 裁剪与主体焦点策略;
- 图片是内容、装饰还是交互控件;
- 色彩空间、透明度、动画和文字可读性要求。
设置 width 和 height,或等效的 aspect-ratio,让浏览器在图片到达前预留空间。这可以减少布局偏移,但不能让尺寸错误或裁剪错误的资源变得合理。
按内容选择格式
| 内容与约束 | 可考虑的方案 | 必须验证 |
|---|---|---|
| 照片和渐变 | JPEG、WebP 或 AVIF 衍生版本 | 纹理、振铃、色度伪影、字节数、解码成本 |
| 截图、界面和锐利文字 | PNG 或经过测试的无损/近无损格式 | 边缘、文字、Alpha、文件大小 |
| 标志、图标和简单插图 | 源文件可信时使用 SVG,否则生成栅格衍生图 | 清洗、字体、滤镜、固有尺寸 |
| 短动画 | 按客户端选择动画 WebP/AVIF、APNG、GIF 或视频 | 循环、时序、无障碍、CPU 与内存 |
| 印刷或归档交换 | TIFF 或工作流要求的主文件格式 | 色彩配置、位深、元数据、下游软件 |
WebP 和 AVIF 不保证固定的体积下降。应在相同尺寸和可比视觉目标下与当前基线比较。还要为编辑、下载、爬虫和浏览器矩阵之外的客户端保留回退。不要把不可信 SVG 当作普通静态数据,它是需要清洗和隔离的主动 XML。
压缩与避免虚假精确
有损编码会丢弃信息,无损编码只保证保留它收到的像素。两者都不能抵消此前的缩放、色彩转换或有损编码。应从适合编辑的源文件生成交付衍生图,避免反复重新编码交付 JPEG。
质量数值是编码器特定的控制参数。某个库中的 80 不是可跨工具迁移的视觉质量承诺。对每种内容建立少量候选,然后比较:
- 实际显示尺寸下的感知缺陷,包括文字和人脸;
- 压缩字节数和传输时间;
- 代表性硬件上的解码与栅格化成本;
- 色彩、Alpha、动画和元数据行为;
- 下游兼容性与缓存影响。
色度子采样可能减少颜色细节,并损伤小文字或高饱和边缘。包含界面文字或线稿时应保留更高色度,再根据结果决定,而不是对所有图片套用 4:2:0。
响应式交付与艺术指导
srcset 表达宽度或像素密度候选,sizes 告诉浏览器插槽可能有多宽。sizes 不准确时,浏览器可能选择过大的候选。<picture> 可以选择格式或不同裁剪,但其中的回退 <img> 仍然是语义图片,必须提供有意义的替代文本。
<picture>
<source
type="image/avif"
srcset="/img/article-640.avif 640w, /img/article-1280.avif 1280w"
sizes="(max-width: 720px) 100vw, 720px"
/>
<source
type="image/webp"
srcset="/img/article-640.webp 640w, /img/article-1280.webp 1280w"
sizes="(max-width: 720px) 100vw, 720px"
/>
<img
src="/img/article-1280.jpg"
srcset="/img/article-640.jpg 640w, /img/article-1280.jpg 1280w"
sizes="(max-width: 720px) 100vw, 720px"
width="1280"
height="720"
alt="技术人员检查电路板的照片"
/>
</picture>
当主体或裁剪需要随断点变化时才使用艺术指导,不要只是为了重复同一文件。要测试键盘缩放、高像素密度显示、慢网络以及内容变化导致的插槽宽度变化。
加载、解码与请求优先级
原生懒加载只是调度提示,不是保证。对确实位于首屏下方且不是主要任务所需的图片使用 loading="lazy"。不要把它用于可能成为 LCP 的图片,或用于在很短视口下立即可见的图片。
关键首屏图应结合页面布局和框架的优先级机制谨慎处理。fetchpriority="high" 只应在经过测试的窄场景中使用;给大量图片设置高优先级会与 CSS、字体和脚本竞争。decoding="async" 同样是提示,不保证解码永远不会影响响应性。
<!-- 关键图片:预留空间,不使用懒加载。 -->
<img
src="/img/hero-1280.webp"
width="1280"
height="720"
fetchpriority="high"
alt="机械臂分拣可回收零件的照片"
/>
<!-- 非关键图片:确认位于首屏下方后再懒加载。 -->
<img
src="/img/related-640.webp"
width="640"
height="360"
loading="lazy"
decoding="async"
alt="分拣后材料的特写照片"
/>
不要采用只替换 src、却没有无脚本回退、可靠尺寸、错误处理和取消行为的 JavaScript 懒加载。原生能力通常是更简单的基线,增加观察器前应先测量收益。
缓存、CDN 与构建流水线
图片 CDN 可以调整尺寸、转换格式、协商交付并缓存衍生图,但它不会自动知道正确裁剪、授权、留存或质量目标。应校验转换参数、限制请求尺寸,避免用户控制的 URL 变成 SSRF 或缓存投毒路径。
对于内容寻址且不可变的衍生资源,可以在 URL 随字节变化时使用长期缓存。可变 URL 则需要明确的重新验证和清除策略。记录源版本、转换参数、编码器版本、输出哈希、色彩策略和审核结果,才能复现衍生图。
构建工具也遵循同样原则。需要可复现时固定工具链,让失败可见,并测试元数据清理、方向处理、ICC 配置、Alpha 和动画,而不是让它们被默认行为静默丢弃。
无障碍、色彩与隐私
替代文本描述图片的目的或信息,不会因为更换文件格式而自动生成。装饰图应使用空替代文本,信息图应提供简洁上下文。不要把关键信息只放在压缩位图中,并为必要动画提供静态替代。
应保留源色彩配置,或记录有意进行的转换策略。在色彩管理和非色彩管理显示环境上检查广色域图片。EXIF 可能含有 GPS、拍摄时间、设备标识、方向信息和缩略图;不需要时应在发布前删除敏感元数据,但要记住清理元数据不能让人物、嵌入内容或授权义务消失。
如何测量一次优化实验
不要只用一张有利图片作为样本。应固定或记录:
- 源文件和内容类型;
- 编码器与版本、参数以及色彩管理策略;
- 尺寸、裁剪、质量目标和回退格式;
- 浏览器/解码器、设备类别、网络配置、缓存状态和并发;
- 字节数、解码尺寸、LCP、CLS、交互延迟、解码时间和缺陷审核标准等指标。
以基线为对照,每次只改变一个主要变量。报告分布和失败样本,而不是只展示最好的资源。浏览器、编码器、CDN 或内容变化后重新运行。只有当相关用户群体接受了端到端权衡时,图片优化才算成功。
实施清单
- 确定图片角色、渲染插槽、裁剪方式和无障碍语义。
- 保留适合编辑的源文件,并记录权利和溯源。
- 从源文件生成有明确尺寸的衍生图,避免反复有损转换。
- 在目标尺寸和代表性解码器上测试格式候选。
- 在加载前设置固有尺寸或
aspect-ratio。 - 只有在选择规则准确时才使用
srcset/sizes和<picture>。 - 让可能成为 LCP 的内容不参与懒加载,并验证请求优先级。
- 对确实非关键的内容懒加载,并保留有效回退。
- 配置缓存键、清除/重新验证、转换限制和授权。
- 检查色彩、Alpha、元数据、动画、替代文本和输出完整性。
- 监测真实用户指标,并按设备和连接类型定位回归。
常见问题
WebP 或 AVIF 一定比 JPEG 好吗?
不一定。它们可能在某个样本集上减少字节数,但编码时间、解码成本、色彩行为、编辑支持和回退都会改变判断。应在产品实际服务的尺寸和视觉质量目标下,用代表性衍生图进行比较。
所有图片都应该懒加载吗?
不应该。可能成为 LCP 或首屏立即可见的图片应明确调度,而不是默认延迟。懒加载通常适合首屏下方的非关键内容,但仍需要真实设备测试。
设置 width 和 height 会让图片加载更快吗?
它们主要用于预留布局空间、减少 CLS,不会减少传输字节,也不能代替响应式候选。应与正确尺寸、srcset、sizes 和合适的加载优先级一起使用。
80 这样的质量值是标准吗?
不是。它是编码器特定的控制值。不同库和版本可能产生不同的视觉质量、色度处理和文件大小,应通过记录过的对比选择,而不是照抄通用表格。
删除 EXIF 就能让图片私密吗?
不能。它可能删除 GPS 或设备元数据,但像素仍可能暴露人物、地点、文档或嵌入信息。还要检查图片本身、权利、交付端点和留存策略。
一手来源
- MDN:响应式图片
- MDN:懒加载
- web.dev:优化最大内容绘制
- web.dev:优化累积布局偏移
- W3C:Web Content Accessibility Guidelines (WCAG) 2.2
- HTTP 缓存规范
- ExifTool 文档
总结
图片优化是一条受控的交付流水线:根据内容选择表示方式,按实际插槽调整尺寸,按照用户任务安排加载,并在真实客户端验证结果。与此同时保留无障碍、色彩、隐私和溯源信息,通过测量理解权衡。即使格式、浏览器、CDN 和设备能力变化,这套方法仍然成立。