IT门户网,专注电脑知识与技术及手机硬件信息服务网站!

当前位置:IT门户网 > 系统教程 >

iOS中图片的解压缩到渲染进程详解

时间:2021-09-14    来源:IT门户网    人气:

在移动app开拓进程中,图片往往是不行或缺的资源。从磁盘上加载一张图片,到显示到屏幕上,中间颠末尾一些巨大的进程,个中很是重要的一步就是对图片的解压缩。下面来一起看看具体的先容吧

一.图像从文件到屏幕进程

iOS,图片,解压缩,渲染

凡是计较机在显示是CPU与GPU协同相助完成一次.接下来我们相识一下CPU/GPU等在这样一次渲染进程中,详细的分工是什么?

CPU: 计较视图frame,图片解码,需要绘制纹理图片通过数据总线交给GPU

GPU: 纹理殽杂,极点调动与计较,像素点的填充计较,渲染到帧缓冲区。

时钟信号:垂直同步信号V-Sync / 程度同步信号H-Sync。

iOS设备双缓冲机制:显示系统凡是会引入两个帧缓冲区,双缓冲机制

图片显示到屏幕上是CPU与GPU的协作完成

对应应用来说,图片是最占用手机内存的资源,将一张图片从磁盘中加载出来,并最终显示到屏幕上,中间其实颠末尾一系列巨大的处理惩罚进程。

二.图片加载的事情流程

1、假设我们利用 +imageWithContentsOfFile: 要领从磁盘中加载一张图片,这个时候的图片并没有解压缩;

2、然后将生成的 UIImage 赋值给 UIImageView ;

3、接着一个隐式的 CATransaction 捕捉到了 UIImageView 图层树的变革;

4、在主线程的下一个 runloop 到来时,Core Animation 提交了这个隐式的 transaction ,这个进程大概会对图片举办 copy 操纵,而受图片是否字节对齐等因素的影响,这个 copy 操纵大概会涉及以下部门或全部步调:

分派内存缓冲区用于打点文件 IO 息争压缩操纵;

将文件数据从磁盘读到内存中;

将压缩的图片数据解码成未压缩的位图形式,这是一个很是耗时的 CPU 操纵;

最后 Core Animation 中CALayer利用未压缩的位图数据渲染 UIImageView 的图层。

CPU计较好图片的Frame,对图片解压之后.就会交给GPU来做图片渲染

5、渲染流程

GPU获取获取图片的坐标

将坐标交给极点着色器(极点计较)

将图片光栅化(获取图片对应屏幕上的像素点)

片元着色器计较(计较每个像素点的最终显示的颜色值)

从帧缓存区中渲染到屏幕上

我们提到了图片的解压缩是一个很是耗时的 CPU 操纵,而且它默认是在主线程中执行的。那么当需要加载的图片较量多时,就会对我们应用的响应性造成严重的影响,尤其是在快速滑动的列表上,这个问题会表示得越发突出。

三.为什么要解压缩图片

既然图片的解压缩需要耗损大量的 CPU 时间,那么我们为什么还要对图片举办解压缩呢?是否可以不颠末解压缩,而直接将图片显示到屏幕上呢?谜底是否认的。要想弄大白这个问题,我们首先需要知道什么是位图

其实,位图就是一个像素数组,数组中的每个像素就代表着图片中的一个点。我们在应用中常常用到的 JPEG 和 PNG 图片就是位图

各人可以实验

UIImage *image = [UIImage imageNamed:@"text.png"];CFDataRef rawData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));

打印rawData,这里就是图片的原始数据.

事实上,不管是 JPEG 照旧 PNG 图片,都是一种压缩的位图图形名目。只不外 PNG 图片是无损压缩,而且支持 alpha 通道,而 JPEG 图片则是有损压缩,可以指定 0-100% 的压缩比。值得一提的是,在苹果的 SDK 中专门提供了两个函数用来生成 PNG 和 JPEG 图片:

// return image as PNG. May return nil if image has no CGImageRef or invalid bitmap formatUIKIT_EXTERN NSData * __nullable UIImagePNGRepresentation(UIImage * __nonnull image);// return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least) UIKIT_EXTERN NSData * __nullable UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality);

因此,在将磁盘中的图片渲染到屏幕之前,必需先要获得图片的原始像素数据,才气执行后续的绘制操纵,这就是为什么需要对图片解压缩的原因。

四.解压缩道理

既然图片的解压缩不行制止,而我们也不想让它在主线程执行,影响我们应用的响应性,那么是否有较量好的办理方案呢?

我们前面已经提到了,当未解压缩的图片将要渲染到屏幕时,系统会在主线程对图片举办解压缩,而假如图片已经解压缩了,系统就不会再对图片举办解压缩。因此,也就有了业内的办理方案,在子线程提前对图片举办强制解压缩。

而强制解压缩的道理就是对图片举办从头绘制,获得一张新的解压缩后的位图。个中,用到的最焦点的函数是 CGBitmapContextCreate :  

上一篇:c/c++仓库漫衍及其配置要领 下一篇:没有了

相关文章

系统教程排行榜

更多>>

网络知识排行榜

更多>>

系统教程排行榜

更多>>

服务号