图片的解压缩,在SDWebImage中占据了较大的戏份,但其流程还是比较简单的。
图片编解码、解压缩的设计思路:
主要的流程:在图片保存到磁盘之前需要将UIImage对象进行encoder操作,将image转成image data再进行保存,而从磁盘取出图片的时候,需要将image data经过decoder生成image,再将image进行decompress(解压缩)后,再赋值到imageView上进行显示。
代码的角度:由SDWebImageCodersManager
装载全部的编解码器coders
,在进行encoder
、decoder
、decompress
操作的时候都需要遍历coders
,根据format
来选择合适的coder
进行具体操作。而每一coder
都是遵守SDWebImageCoder
协议的。SDWebImageCoder
定义了encoder
、decoder
、decompress
的方法接口。
理解一些概念
-
位图:一个位图是一个像素数组,数组中的每一个像素都代表着图片上的一个点。平时使用PNG、JPG、TIFF都是位图,这些都是经过压缩后生成的,不能直接用于渲染。
-
图片显示和渲染在屏幕上的大致过程:从磁盘上加载一个图片image,将image赋值给UIImageView,当Core Animation捕获到UIImageView的图层树发生变化了,在主线程下一个runloop到来时,Core Animation就会提交这个隐式的transaction,这个过程中会对图片进行拷贝、解压缩等复杂操作,在获取到图片原始像素之后,再进行图片渲染操作。
-
图片的解压缩:图片解压缩就是将图片的二进制数据转成图片原始像素数据的过程,也是从一个位图生成一个新位图的过程。因为图片的解压缩默认是在主线程中进行的,是一个非常耗能的过程,所以SDWebImage的解压缩过程是在子线程中进行的,如果在图片显示之前就将图片强制解压缩,那就不会再对图片进行解压缩了。
图片的编码、解码、解压缩流程
SDWebImageGIFCoder
、SDWebImageImageIOCoder
,它提供了图片的编码,解码,解压和缩小的功能。其通用的流程基本如下:
图片编码:
- 判断图片是否存在。
- 判断图片的格式。
- 创建图像目的地。
- 设置图片方向,并将image添加到图像目的地中。
- 返回编码后的数据
图片解码:
- 判断是否存在图像资源。
- 根据data更新图像资源。
- 根据图像资源创建image
图片解压缩和缩小:
- 判断图片是否需要解码。
- 创建一个位图上下文。
- 将image绘制到这个位图上下文中。
- 从这个位图上下文中获取新的image。
零散的知识点
- 在遍历编码器时,使用的是逆向的遍历,最后添加的编码器会最先被使用,这中设计思想还是值得借鉴的。
- 在图片编解码的过程中,频繁使用了
@autoreleasepool
自动释放池,在内存发生警告的时候自动释放内存。 -
SDWebImageGIFCoder
使用支持GIF编码/解码的ImageIO内置编码器,但在GIF显示方面SDWebImage使用的是FLAnimatedImageView三方。
网友评论