篇1:SDWebImage源码看图片解码

Posted

tags:

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

参考技术A

导语 :这是 SDWebImage源码理解 的第一篇,本篇先介绍图片解码相关的背景知识,然后介绍SDWebImage中解码的源码及其解码相关的问题。

在SDWebImage中处理图片解码的是 SDWebImageDecoder

SDWebImageDecoder的源码有200多行,重要的函数两个。其一是:(默认)解码图片办法decodedImageWithImage: ;其二是:处理大图缩放和解码办法decodedAndScaledDownImageWithImage:。

说明 :解码操作在@autoreleasepool中,可以使得局部变量能尽早释放掉,避免内存峰值过高。

函数原型 CGBitmapContextCreate(void *data,size_t width,size_t height,size_t bitsPerComponent,size_t bytesPerRow,CGColorSpaceRef colorspace,CGBitmapInfo bitmapInfo)

说明 :一个新的位图上下文的像素格式由三个参数决定:每个组件的位数(bitsPerComponent),颜色空间(colorspace),alpha选项(bitmapInfo),alpha值决定了绘制像素的透明性。

凭心而论,后台不经处理,任意下发高分辨率大图这类事发生可能性很少;绝大部分场景下,ios设备上不需要分辨率过高的图(iPhone X的屏幕尺寸也不过是1125px × 2436px),那我们应该考虑什么呢。

SDWebImageDecoder的解码工作中,有两个小问题值得留意一下。

这么做的原因,我认为只要有两点

SDWebImage 中的图片解码

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

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

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

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

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

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

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

yywebimage和sdwebimage哪个好

从零开始用C语言实现图片解码播放器(有源码)

SDWebImage源码阅读-第三篇

SDWebImage源码解析

Jav文件压缩-InputStream转化为base64-Base64解码并生成图片

[iOS开发]SDWebImage源码学习