iOS接入HEIC和AVIF解码说明

在iOS11之前,iOS系统不支持HEIC图片解码,而在iOS16之前不支持AVIF解码。如果您需要解码高级图片处理后的HEIC和AVIF格式,可以配置iOS客户端的SDWebImage图片库,以便支持AVIF和HEIC图片解码。

前提条件

请确保SDWebImage为5.0.0及以上版本。

iOS接入HEIC解码说明

高效率图像格式HEIF(High Efficiency Image Format)是一种压缩图片格式,使用更现代的压缩算法,在相同质量的前提下,HEIF文件的大小约为JPEG文件的40%。

阿里云高性能HEIC解码库是在开源的libheif和libde265基础上进行二次开发的,针对ARM平台进行了大量优化,借鉴了其他同类开源库的优点,并在解码链路的各个环节进行了优化,显著提升了运行速度。与原始开源版本相比,解码效率提升了数倍。阿里云高性能HEIC解码库的代码链接,请参见Github

iOS 11及以上版本支持HEIC解码,无需单独接入。如果您的App需要支持iOS 11以下版本,请按照以下步骤将客户端文件接入阿里云高性能HEIC解码库,配置后SDWebImage即可支持HEIF图片解码。

  1. 修改iOS客户端的Podfile文件,加入阿里云pod仓库和对应HEIF软解库依赖的支持代码。

    #加入阿里云pod仓库
    source 'https://github.com/aliyun/aliyun-specs.git'
    
    pod 'SDWebImageHEIFCoder'
    #指定阿里云优化的HEIF版本
    pod 'libde265', '1.0.10-aliyun'
    pod 'libheif', '1.12.3-aliyun'
    pod 'libyuv-aliyun', '1.8.48'
  2. 使用以下代码以便支持老版本HEIF解码库。

    if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, *)) {
        //iOS11以后的系统不用启用软解。
    } else {
        // iOS11之前的系统不支持硬解,使用软解。
        SDImageHEIFCoder *HEIFCoder = [SDImageHEIFCoder sharedCoder];
        [[SDImageCodersManager sharedManager] addCoder:HEIFCoder];
    }

iOS接入AVIF解码说明

AVIF是一种基于AV1视频编码的新图像格式,相对于JPEG、Webp图片格式压缩率更高,并且画面细节更好。AVIF通过使用更现代的压缩算法,在相同质量的前提下,AVIF文件大小是JPEG文件的35%左右。

iOS系统原生并不支持AVIF的解码处理,因此需要接入三方的解码库,具体操作如下:

  1. 修改Podfile引入如下解码库依赖。

    #加入阿里云pod仓库
    source 'https://github.com/aliyun/aliyun-specs.git'
    
    pod 'SDWebImageAVIFCoder'
    pod 'libavif', :subspecs => [
      'libdav1d'
    ]
    # 引入预编译优化版本的dav1d。
    pod 'libdav1d', '1.0.8-aliyun'
  2. 接入解码库到SDWebImage。

    SDImageAVIFCoder *AVIFCoder = [SDImageAVIFCoder sharedCoder];
    [[SDImageCodersManager sharedManager] addCoder:AVIFCoder];

加载AVIF和HEIC图片

接入新的解码库后,SDWebImage将支持AVIF和HEIC解码,加载图片的方式无需修改,仍与原来的调用方式一致。

  • 通过UIImageView加载图片

    [self.imageView sd_setImageWithURL:[NSURL fileURLWithPath:tempFilePath] completed:nil];
  • 直接下载图片

    [[SDWebImageManager sharedManager] loadImageWithURL:[NSURL fileURLWithPath:tempFilePath] options:0 progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
    }];