全部產品
Search
文件中心

Object Storage Service:iOS接入HEIC和AVIF解碼說明

更新時間:Feb 21, 2025

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