該文章閱讀的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(二)——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