在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) { }];