原始碼閱讀:SDWebImage(四)——SDWebImageCoder

堯少羽發表於2018-05-30

該文章閱讀的SDWebImage的版本為4.3.3。

這個類定義了兩個協議,目的是定義圖片編解碼類所要實現的介面。

1.公共變數與函式

/**
 定義了一個BOOL型別的key,用於定義是否在解壓縮期間縮放圖片
 */
FOUNDATION_EXPORT NSString * _Nonnull const SDWebImageCoderScaleDownLargeImagesKey;
複製程式碼
NSString * const SDWebImageCoderScaleDownLargeImagesKey = @"scaleDownLargeImages";
複製程式碼

/**
 定義了一個單利方法,獲取裝置的RGB色彩空間
 */
CG_EXTERN CGColorSpaceRef _Nonnull SDCGColorSpaceGetDeviceRGB(void);
複製程式碼
CGColorSpaceRef SDCGColorSpaceGetDeviceRGB(void) {
    // 通過單例模式獲取裝置的RGB色彩空間並返回
    static CGColorSpaceRef colorSpace;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        colorSpace = CGColorSpaceCreateDeviceRGB();
    });
    return colorSpace;
}
複製程式碼

/**
 檢查圖片是否有透明度
 */
CG_EXTERN BOOL SDCGImageRefContainsAlpha(_Nullable CGImageRef imageRef);
複製程式碼
BOOL SDCGImageRefContainsAlpha(CGImageRef imageRef) {
    // 如果沒傳圖片就返回沒有透明度
    if (!imageRef) {
        return NO;
    }
    // 獲取圖片的透明度資訊
    CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef);
    // 如果滿足下面的任何一個選項,就代表沒有透明度;否則就有透明度
    BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone ||
                      alphaInfo == kCGImageAlphaNoneSkipFirst ||
                      alphaInfo == kCGImageAlphaNoneSkipLast);
    return hasAlpha;
}
複製程式碼

2.SDWebImageCoder協議

  • 解碼
/**
 如果實現了該方法的類能解碼圖片資料就返回YES;否則,就返回NO
 */
- (BOOL)canDecodeFromData:(nullable NSData *)data;
複製程式碼
/**
 將圖片資料解碼為圖片物件
 */
- (nullable UIImage *)decodedImageWithData:(nullable NSData *)data;
複製程式碼
/**
 用原始影像和影像資料解壓縮影像
 其中引數optionsDict就是利用第一節定義的變數SDWebImageCoderScaleDownLargeImagesKey,如果value傳YES就縮放影像
 */
- (nullable UIImage *)decompressedImageWithImage:(nullable UIImage *)image
                                            data:(NSData * _Nullable * _Nonnull)data
                                         options:(nullable NSDictionary<NSString*, NSObject*>*)optionsDict;
複製程式碼
  • 編碼
/**
 如果實現了該方法的類能編碼圖片資料就返回YES;否則,就返回NO
 */
- (BOOL)canEncodeToFormat:(SDImageFormat)format;
複製程式碼
/**
 將圖片圖片物件編碼為影像資料
 */
- (nullable NSData *)encodedDataWithImage:(nullable UIImage *)image format:(SDImageFormat)format;
複製程式碼

3.SDWebImageProgressiveCoder

/**
 如果實現了該方法的類能逐行解碼圖片資料就返回YES;否則,就返回NO
 */
- (BOOL)canIncrementallyDecodeFromData:(nullable NSData *)data;
複製程式碼
/**
 逐行解碼圖片資料為影像物件
 */
- (nullable UIImage *)incrementallyDecodedImageWithData:(nullable NSData *)data finished:(BOOL)finished;
複製程式碼

可以看到這個類中的兩個協議定義了圖片編解碼類的介面。看完這個類,我們就可以看那些用來編解碼各種格式圖片的類了。

原始碼閱讀系列:SDWebImage

原始碼閱讀:SDWebImage(一)——從使用入手

原始碼閱讀:SDWebImage(二)——SDWebImageCompat

原始碼閱讀:SDWebImage(三)——NSData+ImageContentType

原始碼閱讀:SDWebImage(四)——SDWebImageCoder

原始碼閱讀:SDWebImage(五)——SDWebImageFrame

原始碼閱讀:SDWebImage(六)——SDWebImageCoderHelper

原始碼閱讀:SDWebImage(七)——SDWebImageImageIOCoder

原始碼閱讀:SDWebImage(八)——SDWebImageGIFCoder

原始碼閱讀:SDWebImage(九)——SDWebImageCodersManager

原始碼閱讀:SDWebImage(十)——SDImageCacheConfig

原始碼閱讀:SDWebImage(十一)——SDImageCache

原始碼閱讀:SDWebImage(十二)——SDWebImageDownloaderOperation

原始碼閱讀:SDWebImage(十三)——SDWebImageDownloader

原始碼閱讀:SDWebImage(十四)——SDWebImageManager

原始碼閱讀:SDWebImage(十五)——SDWebImagePrefetcher

原始碼閱讀:SDWebImage(十六)——SDWebImageTransition

原始碼閱讀:SDWebImage(十七)——UIView+WebCacheOperation

原始碼閱讀:SDWebImage(十八)——UIView+WebCache

原始碼閱讀:SDWebImage(十九)——UIImage+ForceDecode/UIImage+GIF/UIImage+MultiFormat

原始碼閱讀:SDWebImage(二十)——UIButton+WebCache

原始碼閱讀:SDWebImage(二十一)——UIImageView+WebCache/UIImageView+HighlightedWebCache

相關文章