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 格式:

  1. 更高的压缩效率 :这是 AVIF 最大的亮点。
    • 与 JPEG 相比 :在相同的视觉质量下,AVIF 文件大小通常比 JPEG 小 50% 以上。
    • 与 WebP 相比 :在相同的视觉质量下,AVIF 文件大小通常比 WebP 小 20-30%
  2. 支持更丰富的特性
    • 高动态范围(HDR):AVIF 原生支持 HDR 图像,能够存储更广泛的亮度和色彩信息,呈现更逼真的画质。
    • 宽色域(WCG):支持如 P3 这样的宽色域,色彩表现更丰富。
    • 深度图:可以包含深度信息,用于创建视差效果或支持 AR/VR 应用。
    • 动画:支持多帧动画,功能类似 GIF 和 WebP 动画,但压缩效率更高。
    • Alpha 透明通道:像 PNG 和 WebP 一样支持透明。

三、AVIF 在 iOS 开发中的应用

与 WebP 类似,AVIF 在 iOS 开发中的主要应用场景是:

  1. 作为 App 内资源 :将 App 中的静态图片资源转换为 AVIF 格式,可以比 WebP 更进一步地减小 .ipa 包体积。
  2. 作为网络图片:从服务器加载 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 in
    if let data = data, let avifImage = UIImage(data: data) {
        DispatchQueue.main.async {
            self.imageView.image = avifImage
        }
    }
}.resume()

注意 :在 Info.plist 中添加 NSAppTransportSecurity -> NSAllowsArbitraryLoadsYES(不推荐),或者为特定域名添加例外,以允许 HTTP 加载。推荐使用 HTTPS。

Asset Catalog 支持:

你可以直接将 .avif 文件拖入 Assets.xcassets 中,Xcode 会像处理其他图片格式一样处理它。

2. 兼容 iOS 16 以下版本

如果你的 App 需要支持 iOS 15 或更低版本,就不能使用原生的 AVIF 支持。这时,你需要借助第三方库。

主流第三方库:

  • libavif:这是 AVIF 格式的官方参考实现库。你需要将其集成到项目中,并使用它来解码 AVIF 数据。
  • SDWebImageAVIFCoder :这是 SDWebImage 框架的一个插件,提供了 AVIF 解码支持。它内部也是基于 libavif 构建的。

使用 SDWebImageAVIFCoder 示例:

  1. 安装 :通过 CocoaPods: pod 'SDWebImageAVIFCoder'

  2. 使用

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"))

五、注意事项

  1. 兼容性
    • iOS 16+:完全原生支持。
    • iOS < 16 :必须使用第三方库(如 SDWebImageAVIFCoder)进行兼容。由于 AVIF 相对较新,在需要广泛兼容旧设备的项目中,采用需谨慎。
  2. 设计与转换
    • 设计师提供的图片资源需要转换为 AVIF。
    • 推荐工具
      • Squoosh:Google 官方的在线图片压缩工具,支持 AVIF 格式。
      • avifenclibavif 库提供的命令行工具,适合批量转换。
      • Photoshop 插件 :可以安装 AVIF 插件(如 AVIF Photoshop Plug-in)来导出 AVIF。
  3. 编码 / 解码性能
    • AVIF 采用的 AV1 算法压缩率更高,但这也意味着编码(生成图片)和解码(加载图片)所需的计算资源更多。在性能较低的设备上,大量加载 AVIF 图片可能会对 CPU 造成一定压力。不过,对于现代 iOS 设备,这通常不是问题。
  4. 服务器支持(网络图片场景)
    • 服务器需要能够生成并返回 AVIF 格式的图片。目前,越来越多的 CDN 和图片服务提供商开始支持 AVIF。

六、WebP 与 AVIF 对比及选择建议

特性 WebP AVIF
压缩效率 更高
iOS 原生支持 iOS 14+ iOS 16+
特性丰富度 支持有损、无损、透明、动画 支持有损、无损、透明、动画、HDR宽色域
生态成熟度 较高,应用广泛 新兴,生态正在快速发展
解码性能 较好 略逊(计算复杂度高)

选择建议:

  • 如果你的 App 最低支持 iOS 16+强烈推荐优先考虑 AVIF。它能提供最佳的压缩效率,尤其是对于需要展示高质量图片的应用。
  • 如果你的 App 支持 iOS 14+ 但需要兼容 iOS 15WebP 是更稳妥的选择。它在压缩效率和兼容性之间取得了很好的平衡,并且生态系统非常成熟。你也可以考虑对 iOS 16+ 用户提供 AVIF,对低版本用户提供 WebP 的降级方案。
  • 如果你的 App 需要支持 iOS 13 或更低版本WebP 是唯一的现代选择(需配合 SDWebImage)。

总结

AVIF 代表了图片格式的未来发展方向,提供了无与伦比的压缩效率和丰富的功能。在 iOS 开发中,它是继 WebP 之后又一个强大的包体积优化和网络性能优化工具。根据你的项目兼容性要求,选择合适的图片格式将为用户带来更快的下载速度和更好的体验

相关推荐
ajassi20002 小时前
开源 Objective-C IOS 应用开发(六)Objective-C 和 C语言
ios·开源·objective-c
Digitally18 小时前
如何在不使用iTunes的情况下在电脑上访问iPhone文件
ios·电脑·iphone
QuantumLeap丶18 小时前
《Flutter全栈开发实战指南:从零到高级》- 14 -网络请求与数据解析
flutter·ios·dart
RollingPin18 小时前
iOS 内存管理之 autoreleasePool
ios·内存管理·runtime·autoreleasepool
BlackWolfSky20 小时前
鸿蒙文件操作
macos·华为·harmonyos·鸿蒙
2501_9159214321 小时前
查看iOS App实时日志的正确方式,多工具协同打造高效调试与问题定位体系(2025最新指南)
android·ios·小程序·https·uni-app·iphone·webview
私人珍藏库1 天前
[Android] AR绘画素描1.0版(AR Draw - Sketch Anime Cartoon 1.0)
macos·ar·sketch
ajassi20001 天前
开源 Objective-C IOS 应用开发(四)Xcode工程文件结构
ios·开源·objective-c
G佳伟1 天前
如何解决解决,微信小程序ios无法长按复制问题<text>设置 selectable=“true“不起作用
ios·微信小程序·小程序