首页 > 代码库 > SDWebImage源码阅读(十三)UIImage+MultiFormat

SDWebImage源码阅读(十三)UIImage+MultiFormat

  这个 UIImage 的一个叫 MultiFormat 的分类,看名字可能已经猜到,UIImage 的多版本,主要功能是用来做 NSData 和  UIImage 的相互转化的。

  .h

1 + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data;
2 - (nullable NSData *)sd_imageData;
3 - (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat;

  定义了 3 个方法,基本只是看方法名和返回值,已经基本猜到各个方法要实现的功能。

  1.这是一个类方法,一个NSData 对象做参数,转化为一个  UIImage 对象返回。

  2.这是一个实例方法,把调取该方法的 UIImage 对象的 NSData 数据返回。

  3.获取 UIImage 的指定图片类型的 NSData 数据。

  .m

 1 + (nullable UIImage *)sd_imageWithData:(nullable NSData *)data {
 2     if (!data) {
 3         return nil;
 4     }
 5     
 6     UIImage *image;
 7     SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:data];
 8     if (imageFormat == SDImageFormatGIF) {
 9         image = [UIImage sd_animatedGIFWithData:data];
10     }
11 #ifdef SD_WEBP
12     else if (imageFormat == SDImageFormatWebP)
13     {
14         image = [UIImage sd_imageWithWebPData:data];
15     }
16 #endif
17     else {
18         image = [[UIImage alloc] initWithData:data];
19 #if SD_UIKIT || SD_WATCH
20         UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data];
21         if (orientation != UIImageOrientationUp) {
22             image = [UIImage imageWithCGImage:image.CGImage
23                                         scale:image.scale
24                                   orientation:orientation];
25         }
26 #endif
27     }
28 
29 
30     return image;
31 }

  把 NSData 转化为 UIImage。

  如果 data 不存在,则直接返回 nil。

  根据 data 判断 UIImage 的后缀类型并赋值给 imageFormat。

  如果 imageFormat 是 SDImageFormatGIF,调用 sd_animatedGIFWithData: 把 data 转化为图片。

  如果 imageFormat 是 SDImageFormatWebP 则做相应的处理,这里并没有给出。

  其他的情况:

  直接调用 initWithData: 把 data 转化为 UIImage。

  如果是 iOS 平台开发或者 TV 平台开发或者 WATCH 平台开发,使用 data 调用 sd_imageOrientationFromImageData: 获取图片的方向并赋值给 orientation。

  如果 orientation 不等于 UIImageOrientationUP (默认方向),则调用:

1 + (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0);

  重新调整图片方向。

  最后返回 iamge。

 1 +(UIImageOrientation)sd_imageOrientationFromImageData:(nonnull NSData *)imageData {
 2     UIImageOrientation result = UIImageOrientationUp;
 3     CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
 4     if (imageSource) {
 5         CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL);
 6         if (properties) {
 7             CFTypeRef val;
 8             int exifOrientation;
 9             val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation);
10             if (val) {
11                 CFNumberGetValue(val, kCFNumberIntType, &exifOrientation);
12                 result = [self sd_exifOrientationToiOSOrientation:exifOrientation];
13             } // else - if it‘s not set it remains at up
14             CFRelease((CFTypeRef) properties);
15         } else {
16             //NSLog(@"NO PROPERTIES, FAIL");
17         }
18         CFRelease(imageSource);
19     }
20     return result;
21 }

 

SDWebImage源码阅读(十三)UIImage+MultiFormat