首页 > 代码库 > 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