在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图片解码。
修改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'
使用以下代码以便支持老版本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的解码处理,因此需要接入三方的解码库,具体操作如下:
修改Podfile引入如下解码库依赖。
#加入阿里云pod仓库 source 'https://github.com/aliyun/aliyun-specs.git' pod 'SDWebImageAVIFCoder' pod 'libavif', :subspecs => [ 'libdav1d' ] # 引入预编译优化版本的dav1d。 pod 'libdav1d', '1.0.8-aliyun'
接入解码库到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) { }];