SDWebImage 中的图片解码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDWebImage 中的图片解码相关的知识,希望对你有一定的参考价值。

参考技术A 一般我们使用的图像是JPEG/PNG,这些图像数据不是位图,而是是经过编码压缩后的数据,需要线将它解码转成位图数据,然后才能把位图渲染到屏幕上。

当你用 UIImage 或 CGImageSource 的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。

ios默认是在主线程解码,所以SDWebImage将这个过程放到子线程了。
同时因为位图体积很大,所以磁盘缓存不会直接缓存位图数据,而是编码压缩后的PNG或JPG数据。

概括来说,从磁盘中加载一张图片,并将它显示到屏幕上,中间的 主要工作流 如下:

在上面的步骤中,我们提到了图片的解压缩是一个非常耗时的 CPU 操作,并且它默认是在主线程中执行的。那么当需要加载的图片比较多时,就会对我们应用的响应性造成严重的影响,尤其是在快速滑动的列表上,这个问题会表现得更加突出。

解压是耗时的,而系统默认是在主线程执行,所以业界通常有一种做法是,异步强制解压,也就是在异步线程主动将二进制图片数据解压成位图数据,使用CGBitmapContextCreate(...)系列方法就能实现。
该处理方式在众多图片处理框架下都有体现。

以上是关于SDWebImage 中的图片解码的主要内容,如果未能解决你的问题,请参考以下文章

yywebimage和sdwebimage哪个好

WebGL 中的图片解码优化

从图片中解码文本或任何简单对象

新一代图片编解码技术在淘宝的应用及落地

调用支付宝人脸采集查询图片Base64解码

Java 中,对Oracle Clob中的图片Base64进行解码后用System.out.println() 输出为啥成乱码,求高手帮忙。