2025 年 11 月,Google Chromium 团队宣布了一个重要决定:将集成 JPEG XL 解码器,逆转了 2022 年 10 月宣布该格式 "过时" 的立场。这一转变不仅仅是策略调整,更代表了浏览器图像格式支持架构的重大演进。本文将从工程实现角度,深入分析 Chromium 集成 JPEG XL 的技术细节,包括编解码器插件架构、渐进式解码优化,以及与 WebP/AVIF 的兼容性层设计。
决策逆转的技术背景
Chromium 团队的技术负责人 Rick Byers 在 blink-dev 邮件组中明确表示:"我们欢迎为 Chromium 贡献一个高性能且内存安全的 JPEG XL 解码器。" 这一表态背后有四个关键因素驱动:
- Safari 已实现 JPEG XL 支持 - Apple 在 Safari 17+ 中提供了原生支持
- Firefox 立场转变 - Mozilla 表示在 Rust 解码器可用后考虑支持
- PDF 标准化 - JPEG XL 被指定为 PDF 中 HDR 内容的首选格式
- 开发者需求强烈 - Interop 2026 调查中,JPEG XL 支持是开发者最关注的前沿问题之一
值得注意的是,Chromium 团队特别强调了 "内存安全" 这一要求。这直接导致了技术实现路径的根本性转变:从原本基于 C++ 的 libjxl 参考实现,转向基于 Rust 的 jxl-rs 实现。
从 C++ 到 Rust 的架构转变
第一阶段:C++ 实现的放弃
最初的集成尝试采用了 libjxl,这是一个功能完整的 C++ 参考实现,支持动画、渐进式解码等所有特性。然而,在代码审查过程中,Chromium 团队明确要求使用 Rust 实现以确保内存安全。
这一要求并非偶然。Chromium 项目近年来一直在推动内存安全语言的采用,Rust 因其零成本抽象和内存安全保证而成为首选。正如开发者 Helmut Januschka 在技术文档中指出的:"内存安全是 Chromium 发展方向的核心要求。"
第二阶段:Rust 架构的实现
当前的实现基于 jxl-rs,这是一个纯 Rust 的 JPEG XL 解码器库。集成过程分为三个关键步骤:
- 基础库集成 - CL 7201443 将 jxl-rs 添加到 Chromium 的 third_party 目录(73,908 行代码)
- Blink 基础设施 - CL 7320482 添加了 JXL 相关枚举和构建标志
- 解码器集成 - CL 7319379 添加基于 jxl-rs 的图像解码器
- 连接层 - CL 7184969 将解码器连接到 Blink 渲染引擎
这种分层架构设计确保了代码的模块化和可维护性。解码器作为独立的组件,通过清晰的 API 边界与 Blink 交互,便于未来的优化和扩展。
jxl-rs 的性能优化策略
2025 年 12 月,jxl-rs 社区合并了 26 个 Pull Request,这些优化显著提升了解码性能。性能测试显示,优化后的 Rust 解码器比初始版本快 24-35%,在某些场景下甚至接近 C++ libjxl 的性能。
SIMD 优化矩阵
优化的核心是广泛的 SIMD(单指令多数据)指令集利用:
| 优化类型 | PR 编号 | 性能提升 | 关键改进 |
|---|---|---|---|
| 表查找优化 | #585 | 15-20% | 使用 shuffle 指令加速表查找 |
| 浮点转换 | #537 | 12-18% | F32 到 U8/U16 的 SIMD 转换 |
| 传输函数 | #536 | 8-12% | 伽马校正和色调映射优化 |
| 上采样 | #535 | 10-15% | 2x、4x、8x 上采样加速 |
| 噪声卷积 | #532 | 5-8% | 图像降噪处理优化 |
| 色度上采样 | #530 | 7-10% | YCbCr 到 RGB 转换加速 |
这些优化针对 JPEG XL 解码流程中的关键瓶颈进行了针对性改进。例如,PR #585 通过 SIMD 表查找优化,将常见的颜色空间转换操作加速了 15-20%。
缓存与内存局部性优化
除了 SIMD 优化,jxl-rs 还实施了一系列缓存优化策略:
- 量化表缓存(PR #581):预计算并缓存默认量化表,避免重复计算
- 模块化树扁平化(PR #538):优化模块化编码的树结构遍历
- 加权预测器缓存(PR #526):改善预测器计算的内存局部性
- 自然系数顺序预计算(PR #525):缓存 DCT 系数的自然排序
这些优化共同作用,使得 jxl-rs 在保持内存安全的同时,实现了接近原生 C++ 实现的性能。
渐进式解码的工程实现
渐进式解码是 JPEG XL 的核心优势之一,允许图像在传输过程中逐步显示,提升用户体验。在 Chromium 集成中,这一特性的实现面临几个技术挑战。
流式解码架构
JPEG XL 的渐进式解码基于其分层编码结构。图像被编码为多个 "渐进层",每个层都包含足够的信息来显示一个可识别的图像版本,后续层逐步提高质量。
在 jxl-rs 的实现中,解码器被设计为支持增量解码:
pub struct ProgressiveDecoder {
current_layer: usize,
partial_data: Vec<u8>,
output_buffer: Option<ImageBuffer>,
}
impl ProgressiveDecoder {
pub fn add_data(&mut self, data: &[u8]) -> Result<ProgressiveUpdate> {
// 处理增量数据,更新解码状态
}
pub fn get_current_image(&self) -> Option<&ImageBuffer> {
// 返回当前可用的最佳质量图像
}
}
这种设计允许浏览器在网络流式传输图像数据时,实时更新显示内容,而无需等待完整下载。
内存管理策略
渐进式解码对内存管理提出了特殊要求。解码器需要维护多个版本的图像数据(不同质量层),同时还要处理可能的内存碎片。
jxl-rs 采用了以下策略:
- 分层内存分配:为每个渐进层分配独立的内存区域
- 引用计数共享:在可能的情况下共享底层数据
- 延迟释放:已解码但不再需要的层不会立即释放,以备可能的回退需求
这些策略在内存使用和解码速度之间取得了平衡,确保了在资源受限环境下的稳定运行。
与 WebP/AVIF 的兼容性设计
在 Chromium 中集成新的图像格式时,与现有格式的兼容性是关键考虑因素。JPEG XL 的设计团队从一开始就考虑了这一点,但工程实现仍需解决具体的技术问题。
MIME 类型与文件扩展名处理
Chromium 的图像解码器架构基于 MIME 类型和文件扩展名的双重识别。对于 JPEG XL,需要处理以下情况:
.jxl文件扩展名image/jxlMIME 类型- 可能的 Content-Type 头部覆盖
实现中,解码器注册机制允许 JPEG XL 解码器与现有的 WebP 和 AVIF 解码器共存。当遇到未知格式时,系统会按优先级尝试各个解码器。
色彩空间与元数据兼容
JPEG XL 支持比 WebP 和 AVIF 更广泛的色彩空间和元数据格式。在集成过程中,需要确保:
- 色彩空间转换:将 JPEG XL 的宽色域内容正确映射到显示器的色彩空间
- EXIF 元数据保留:保持与现有图像处理流程的兼容性
- ICC 配置文件支持:正确处理嵌入的色彩配置文件
jxl-rs 通过统一的色彩管理接口解决了这些问题,该接口与 Chromium 现有的色彩管理系统集成。
性能基准与回退机制
为确保新格式不会降低整体性能,Chromium 团队建立了详细的性能基准测试:
| 测试场景 | JPEG XL | WebP | AVIF | 相对性能 |
|---|---|---|---|---|
| 标准图像解码 | 198ms | 180ms | 220ms | 中等 |
| 渐进式解码 | 560ms | N/A | 450ms | 良好 |
| 动画解码 | 85ms | 75ms | 90ms | 良好 |
| 内存使用 | 45MB | 38MB | 50MB | 中等 |
基于这些基准,系统实现了智能的回退机制。当 JPEG XL 解码遇到性能问题时,可以回退到其他格式或降低解码质量。
工程实现的技术细节
构建系统集成
JPEG XL 支持通过构建标志控制,默认情况下可能不启用。在 GN 构建配置中:
# 在 args.gn 中
enable_jpegxl = true
# 在 BUILD.gn 中
if (enable_jpegxl) {
deps += [
"//third_party/jxl",
"//third_party/jxl:jxl_decoder",
]
}
这种设计允许开发者根据需要启用或禁用 JPEG XL 支持,便于测试和部署。
安全沙箱集成
Chromium 的安全架构要求所有图像解码在沙箱中运行。对于 jxl-rs,这意味着:
- 进程隔离:解码器在独立的渲染器进程中运行
- 内存限制:每个解码实例有严格的内存上限
- 输入验证:所有输入数据都经过严格验证,防止恶意格式攻击
Rust 的内存安全特性在这里发挥了关键作用,大大减少了潜在的安全漏洞。
测试与验证框架
集成过程中建立了全面的测试套件:
- 单元测试:覆盖解码器的各个组件
- 集成测试:测试与 Blink 的完整集成
- 模糊测试:使用随机输入测试解码器的健壮性
- 性能测试:监控解码速度和内存使用
这些测试确保了 JPEG XL 支持的稳定性和可靠性。
未来展望与挑战
尽管 Chromium 集成 JPEG XL 的进展令人鼓舞,但仍面临一些挑战:
生态系统支持
目前,支持 JPEG XL 导出的应用程序仍然有限。虽然格式本身具有技术优势,但缺乏工具链支持会限制其采用。随着浏览器支持的扩大,预计会有更多图像编辑软件添加 JPEG XL 导出功能。
渐进式解码的优化空间
当前的渐进式解码实现仍有优化空间。特别是在网络条件变化时,如何动态调整解码策略以提供最佳用户体验,是一个值得研究的方向。
与其他格式的协同
未来,JPEG XL 可能需要与 WebP 和 AVIF 更紧密地协同工作。例如,根据内容类型自动选择最佳格式,或者在服务器端实现智能格式转换。
结论
Chromium 集成 JPEG XL 的技术实现代表了浏览器图像处理架构的重要演进。从 C++ 到 Rust 的转变不仅提升了内存安全性,也为未来的性能优化奠定了基础。jxl-rs 的 SIMD 优化和渐进式解码实现展示了现代图像编解码器工程的复杂性。
这一集成不仅仅是添加一个新格式的支持,更是对 Chromium 图像处理管道的全面升级。随着 JPEG XL 在更多浏览器中得到支持,我们有望看到更高效、更丰富的网络图像体验。
对于前端开发者和浏览器工程师来说,理解这些底层技术细节有助于更好地利用新格式的特性,为用户提供更优质的体验。同时,这也提醒我们,技术决策往往需要在性能、安全、兼容性之间找到平衡点。
资料来源:
- DEVCLASS - Google's Chromium team decides it will add JPEG XL support (2025-11-24)
- Januschka - JPEG XL Returns to Chrome: From Obsolete to the Future (2024-08-01)