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 }
时间: 2024-11-09 13:15:41

SDWebImage源码阅读(十三)UIImage+MultiFormat的相关文章

SDWebImage源码阅读(三)UIImage+GIF

UIImage+GIF 是UIImage 类的一个GIF 分类,在之前的版本里面这个分类是用了处理GIF 动态图片的但是会有内存暴增的bug.在当前 '4.0.0-beta2' 的版本里GIF 动态图片处理放在了UIImage+MultiFormat  这个分类里面,而当前这个GIF 的分类的功能只是将动态图片作为静态图片来处理,如果是静态图片的NSData 数据则转化为静态UIImage 直接返回,如果是动态图片的NSData 数据,则把图像的第1帧图像转换化为静态UIImage 返回. 首先

SDWebImage源码阅读-第三篇

这一篇讲讲不常用的一些方法. 1 sd_setImageWithPreviousCachedImageWithURL: placeholderImage: options: progress: completed: 取得上次缓存的图片,然后作为占位图的参数再次进行一次图片设置. - (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options

【原】SDWebImage源码阅读(三)

[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们来到SDWebImageDownloader.m文件中,找到downloadImageWithURL函数.发现代码不是很长,那就一行行读.毕竟这个函数大概做什么我们是知道的.这个函数大概就是创建了一个SDWebImageSownloader的异步下载器,根据给定的URL下载image. 先映入眼帘的

【原】SDWebImage源码阅读(五)

[原]SDWebImage源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 前面的代码并没有特意去讲SDWebImage的缓存机制,主要是想单独开一章节专门讲解缓存.之前我们也遇到一些缓存的属性和方法,比如storeImage.queryDiskCacheForKey.memCache等等. SDWebImage的缓存分为两个部分,一个内存缓存,使用NSCache实现,另一个就是硬盘缓存(disk),使用NSFileManager实现. 不过这么多函数,

【原】SDWebImage源码阅读(二)

[原]SDWebImage源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 解决上一篇遗留的坑 上一篇中对sd_setImageWithURL函数简单分析了一下,还留了一些坑.不过因为我们现在对这个函数有一个大概框架了,我们就按顺序一个个来解决. 首先是这一句代码: objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 就是给UIImageVi

【原】SDWebImage源码阅读(一)

[原]SDWebImage源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 一直没有系统地读过整套源码,就感觉像一直看零碎的知识点,没有系统读过一本专业经典书籍一样,会有点发虚,感觉知识体系不健全!废话少说,这次我决定好好阅读下SDWebImage的源码,我的阅读方式,是带着问题去阅读源码,然后强迫自己写博客. 2. SDWebImage是做什么的? 既然是要带着问题读,那么第一个问题就来了,SDWebImage是做什么的?SDWebImage是一个开源

SDWebImage源码阅读(四)SDWebImageDecoder

一般我们都是使用: 1 + (nullable UIImage *)imageNamed:(NSString *)name; // load from main bundle 和: 1 + (nullable UIImage *)imageWithContentsOfFile:(NSString *)path; 两种方式加载图片,它们两个的区别在SDWebImage源码阅读前的准备(三)UIImage.h 里面的 "(六):加载和创建UIImage 的类方法和实例方法:"部分有详细的介

SDWebImage源码阅读(二)NSData+ImageContentType

NSData+ImageContentType 是NSData 的分类(Category). 创建分类的步骤: 在Xcode 工程页面,按command + N ,在iOS -> Source 选择Objective-C File ,点击Next ,File Type 选择 Category ,file 框里输入分类名字,Calss 为要添加分类的类,可以是系统的类也可以是自定义的类,当然这里出现的主要是系统的类. 分类的描述: 无论一个类设计的如何完美,都不可避免的会遇到没有预测到的需求,那怎

SDWebImage源码阅读前的准备(一)预处理条件编译

阅读前的扩展: 条件编译:#ifdef #elif #ifndef #if #else #endif 的用法,及 #define #undef 的用法. #ifdef/#elif/#ifndef/#if/#else/#endif 这几个条件编译指令是在进行条件编译的时候使用的. 学习条件编译首先对C语言的预处理进行学习,C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,