ios-AVIF
我们来详细介绍一下 AVIF(AV1 Image File Format),这是一种比 WebP 更先进、压缩效率更高的图片格式。
一、AVIF 是什么?
AVIF 是基于 AV1 视频编解码器的一种现代图片格式。AV1 是由开放媒体联盟(Alliance for Open Media, AOMedia)开发的免费、开源的视频编码标准,旨在提供比 H.265/HEVC 更高的压缩效率。AVIF 则将 AV1 的帧内编码技术应用于静态图像,从而实现了卓越的压缩性能。
二、AVIF 的核心优势
AVIF 在很多方面都优于 WebP 和传统的 JPEG/PNG 格式:
- 更高的压缩效率:这是 AVIF 最大的亮点。
- 与 JPEG 相比:在相同的视觉质量下,AVIF 文件大小通常比 JPEG 小 50% 以上。
- 与 WebP 相比:在相同的视觉质量下,AVIF 文件大小通常比 WebP 小 20-30%。
- 支持更丰富的特性:
- 高动态范围(HDR):AVIF 原生支持 HDR 图像,能够存储更广泛的亮度和色彩信息,呈现更逼真的画质。
- 宽色域(WCG):支持如 P3 这样的宽色域,色彩表现更丰富。
- 深度图:可以包含深度信息,用于创建视差效果或支持 AR/VR 应用。
- 动画:支持多帧动画,功能类似 GIF 和 WebP 动画,但压缩效率更高。
- Alpha 透明通道:像 PNG 和 WebP 一样支持透明。
三、AVIF 在 iOS 开发中的应用
与 WebP 类似,AVIF 在 iOS 开发中的主要应用场景是:
- 作为 App 内资源:将 App 中的静态图片资源转换为 AVIF 格式,可以比 WebP 更进一步地减小
.ipa包体积。 - 作为网络图片:从服务器加载 AVIF 格式的图片,可以显著减少网络传输数据量,加快加载速度,尤其适用于图片密集型应用。
四、iOS 中如何使用 AVIF?
iOS 对 AVIF 的原生支持始于 iOS 16。
1. iOS 16+ 原生支持
加载本地 AVIF 文件:
你可以直接使用 UIImage(named:) 或 UIImage(contentsOfFile:) 来加载 AVIF 图片。
swift
// 从 Asset Catalog 加载
if let avifImage = UIImage(named: "my_image.avif") {imageView.image = avifImage
}// 从文件路径加载
if let imagePath = Bundle.main.path(forResource: "my_image", ofType: "avif"),let avifImage = UIImage(contentsOfFile: imagePath) {imageView.image = avifImage
}
加载网络 AVIF 图片:
使用 URLSession 下载后,直接通过 UIImage(data:) 初始化。
swift
let url = URL(string: "https://example.com/image.avif")!URLSession.shared.dataTask(with: url) { data, response, error inif let data = data, let avifImage = UIImage(data: data) {DispatchQueue.main.async {self.imageView.image = avifImage}}
}.resume()
注意:在 Info.plist 中添加 NSAppTransportSecurity -> NSAllowsArbitraryLoads 为 YES(不推荐),或者为特定域名添加例外,以允许 HTTP 加载。推荐使用 HTTPS。
Asset Catalog 支持:
你可以直接将 .avif 文件拖入 Assets.xcassets 中,Xcode 会像处理其他图片格式一样处理它。
2. 兼容 iOS 16 以下版本
如果你的 App 需要支持 iOS 15 或更低版本,就不能使用原生的 AVIF 支持。这时,你需要借助第三方库。
主流第三方库:
- libavif:这是 AVIF 格式的官方参考实现库。你需要将其集成到项目中,并使用它来解码 AVIF 数据。
- SDWebImageAVIFCoder:这是
SDWebImage框架的一个插件,提供了 AVIF 解码支持。它内部也是基于libavif构建的。
使用 SDWebImageAVIFCoder 示例:
-
安装:通过 CocoaPods:
pod 'SDWebImageAVIFCoder' -
使用:
swift
import SDWebImage
import SDWebImageAVIFCoder// 1. 注册 AVIF 解码器
let avifCoder = SDImageAVIFCoder.shared
SDImageCodersManager.shared.addCoder(avifCoder)// 2. 像平常一样使用 SDWebImage 加载图片
// 它会自动检测图片格式并使用相应的解码器
imageView.sd_setImage(with: URL(string: "https://example.com/image.avif"))
五、注意事项
- 兼容性:
- iOS 16+:完全原生支持。
- iOS < 16:必须使用第三方库(如
SDWebImageAVIFCoder)进行兼容。由于 AVIF 相对较新,在需要广泛兼容旧设备的项目中,采用需谨慎。
- 设计与转换:
- 设计师提供的图片资源需要转换为 AVIF。
- 推荐工具:
- Squoosh:Google 官方的在线图片压缩工具,支持 AVIF 格式。
- avifenc:
libavif库提供的命令行工具,适合批量转换。 - Photoshop 插件:可以安装 AVIF 插件(如
AVIF Photoshop Plug-in)来导出 AVIF。
- 编码 / 解码性能:
- AVIF 采用的 AV1 算法压缩率更高,但这也意味着编码(生成图片)和解码(加载图片)所需的计算资源更多。在性能较低的设备上,大量加载 AVIF 图片可能会对 CPU 造成一定压力。不过,对于现代 iOS 设备,这通常不是问题。
- 服务器支持(网络图片场景):
- 服务器需要能够生成并返回 AVIF 格式的图片。目前,越来越多的 CDN 和图片服务提供商开始支持 AVIF。
六、WebP 与 AVIF 对比及选择建议
| 特性 | WebP | AVIF |
|---|---|---|
| 压缩效率 | 高 | 更高 |
| iOS 原生支持 | iOS 14+ | iOS 16+ |
| 特性丰富度 | 支持有损、无损、透明、动画 | 支持有损、无损、透明、动画、HDR、宽色域 |
| 生态成熟度 | 较高,应用广泛 | 新兴,生态正在快速发展 |
| 解码性能 | 较好 | 略逊(计算复杂度高) |
选择建议:
- 如果你的 App 最低支持 iOS 16+:强烈推荐优先考虑 AVIF。它能提供最佳的压缩效率,尤其是对于需要展示高质量图片的应用。
- 如果你的 App 支持 iOS 14+ 但需要兼容 iOS 15:WebP 是更稳妥的选择。它在压缩效率和兼容性之间取得了很好的平衡,并且生态系统非常成熟。你也可以考虑对 iOS 16+ 用户提供 AVIF,对低版本用户提供 WebP 的降级方案。
- 如果你的 App 需要支持 iOS 13 或更低版本:WebP 是唯一的现代选择(需配合
SDWebImage)。
总结
AVIF 代表了图片格式的未来发展方向,提供了无与伦比的压缩效率和丰富的功能。在 iOS 开发中,它是继 WebP 之后又一个强大的包体积优化和网络性能优化工具。根据你的项目兼容性要求,选择合适的图片格式将为用户带来更快的下载速度和更好的体验
