篇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源码看图片解码的主要内容,如果未能解决你的问题,请参考以下文章