该文章阅读的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