美文网首页
SDWebImage-Decoder

SDWebImage-Decoder

作者: 王大吉Rock | 来源:发表于2018-12-10 11:07 被阅读29次

图片的解压缩,在SDWebImage中占据了较大的戏份,但其流程还是比较简单的。

图片编解码、解压缩的设计思路:

主要的流程:在图片保存到磁盘之前需要将UIImage对象进行encoder操作,将image转成image data再进行保存,而从磁盘取出图片的时候,需要将image data经过decoder生成image,再将image进行decompress(解压缩)后,再赋值到imageView上进行显示。
代码的角度:由SDWebImageCodersManager装载全部的编解码器coders,在进行encoderdecoderdecompress操作的时候都需要遍历coders,根据format来选择合适的coder进行具体操作。而每一coder都是遵守SDWebImageCoder协议的。SDWebImageCoder定义了encoderdecoderdecompress的方法接口。

理解一些概念

  1. 位图:一个位图是一个像素数组,数组中的每一个像素都代表着图片上的一个点。平时使用PNG、JPG、TIFF都是位图,这些都是经过压缩后生成的,不能直接用于渲染。

  2. 图片显示和渲染在屏幕上的大致过程:从磁盘上加载一个图片image,将image赋值给UIImageView,当Core Animation捕获到UIImageView的图层树发生变化了,在主线程下一个runloop到来时,Core Animation就会提交这个隐式的transaction,这个过程中会对图片进行拷贝、解压缩等复杂操作,在获取到图片原始像素之后,再进行图片渲染操作。

  3. 图片的解压缩:图片解压缩就是将图片的二进制数据转成图片原始像素数据的过程,也是从一个位图生成一个新位图的过程。因为图片的解压缩默认是在主线程中进行的,是一个非常耗能的过程,所以SDWebImage的解压缩过程是在子线程中进行的,如果在图片显示之前就将图片强制解压缩,那就不会再对图片进行解压缩了。

图片的编码、解码、解压缩流程

SDWebImageGIFCoderSDWebImageImageIOCoder,它提供了图片的编码,解码,解压和缩小的功能。其通用的流程基本如下:

图片编码

  1. 判断图片是否存在。
  2. 判断图片的格式。
  3. 创建图像目的地。
  4. 设置图片方向,并将image添加到图像目的地中。
  5. 返回编码后的数据

图片解码

  1. 判断是否存在图像资源。
  2. 根据data更新图像资源。
  3. 根据图像资源创建image

图片解压缩和缩小

  1. 判断图片是否需要解码。
  2. 创建一个位图上下文。
  3. 将image绘制到这个位图上下文中。
  4. 从这个位图上下文中获取新的image。

零散的知识点

  1. 在遍历编码器时,使用的是逆向的遍历,最后添加的编码器会最先被使用,这中设计思想还是值得借鉴的。
  2. 在图片编解码的过程中,频繁使用了@autoreleasepool自动释放池,在内存发生警告的时候自动释放内存。
  3. SDWebImageGIFCoder 使用支持GIF编码/解码的ImageIO内置编码器,但在GIF显示方面SDWebImage使用的是FLAnimatedImageView三方。

相关文章

  • SDWebImage-Decoder

    图片的解压缩,在SDWebImage中占据了较大的戏份,但其流程还是比较简单的。 图片编解码、解压缩的设计思路: ...

网友评论

      本文标题:SDWebImage-Decoder

      本文链接:https://www.haomeiwen.com/subject/dokrhqtx.html