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

堯少羽發表於2018-07-27

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

由於這幾個分類都是UIImage的分類,並且內容相對較少,就寫在一篇文章中。

1.UIImage+ForceDecode

這個分類為UIImage提供瞭解碼的快捷方法。

1.1.公共方法

/**
 解碼指定的影像物件
 */
+ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image;
複製程式碼
/**
 解碼並縮小指定的影像物件
 */
+ (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image;
複製程式碼

1.2.實現

+ (UIImage *)decodedImageWithImage:(UIImage *)image {
    // 如果沒傳影像物件就返回空
    if (!image) {
        return nil;
    }
    // 建立變數儲存影像資料
    NSData *tempData;
    // 解壓影像
    return [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&tempData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(NO)}];
}
複製程式碼
+ (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image {
    // 如果沒傳影像物件就返回空
    if (!image) {
        return nil;
    }
    // 建立變數儲存影像資料
    NSData *tempData;
    // 解壓並縮小影像
    return [[SDWebImageCodersManager sharedInstance] decompressedImageWithImage:image data:&tempData options:@{SDWebImageCoderScaleDownLargeImagesKey: @(YES)}];
}
複製程式碼

2.UIImage+GIF

這個分類用於建立動圖

2.1.公共方法

/**
 根據影像資料建立影像物件
 */
+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
複製程式碼
/**
 判斷影像物件是否是動圖
 */
- (BOOL)isGIF;
複製程式碼

2.2.實現

+ (UIImage *)sd_animatedGIFWithData:(NSData *)data {
    // 如果沒傳影像資料就返回空
    if (!data) {
        return nil;
    }
    // 解碼資料生成動圖物件
    return [[SDWebImageGIFCoder sharedCoder] decodedImageWithData:data];
}
複製程式碼
- (BOOL)isGIF {
    // 根據images屬性判斷是否是動圖
    return (self.images != nil);
}
複製程式碼

3.UIImage+MultiFormat

這個分類提供了資料和影像互相轉換的方法

3.1.公共屬性

/**
 動圖迴圈次數
 */
@property (nonatomic, assign) NSUInteger sd_imageLoopCount;
複製程式碼

3.2.公共方法

/**
 根據指定資料建立影像物件
 */
+ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data;
複製程式碼
/**
 獲取影像物件的資料
 */
- (nullable NSData *)sd_imageData;
複製程式碼
/**
 根據影像格式獲取影像物件的資料
 */
- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat;
複製程式碼

3.3.實現

- (NSUInteger)sd_imageLoopCount {
    NSUInteger imageLoopCount = 0;
    NSNumber *value = objc_getAssociatedObject(self, @selector(sd_imageLoopCount));
    if ([value isKindOfClass:[NSNumber class]]) {
        imageLoopCount = value.unsignedIntegerValue;
    }
    return imageLoopCount;
}

- (void)setSd_imageLoopCount:(NSUInteger)sd_imageLoopCount {
    NSNumber *value = @(sd_imageLoopCount);
    objc_setAssociatedObject(self, @selector(sd_imageLoopCount), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
複製程式碼
+ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data {
    // 解碼影像資料獲取影像物件
    return [[SDWebImageCodersManager sharedInstance] decodedImageWithData:data];
}
複製程式碼
- (nullable NSData *)sd_imageData {
    // 以未知影像格式呼叫下面方法獲取影像資料
    return [self sd_imageDataAsFormat:SDImageFormatUndefined];
}
複製程式碼
- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat {
    // 建立變數儲存影像資料
    NSData *imageData = nil;
    // 通過編碼獲取影像資料
    if (self) {
        imageData = [[SDWebImageCodersManager sharedInstance] encodedDataWithImage:self format:imageFormat];
    }
    return imageData;
}
複製程式碼

原始碼閱讀系列: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

相關文章