iOS uiimage内存占用大小计算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS uiimage内存占用大小计算相关的知识,希望对你有一定的参考价值。

参考技术A 今天突然遇到一个问题,UI给了很多设计图。但感觉很占内存。所以就想计算一下具体需要占用多少内存。
我们平时看到的png、jpg、webp这些图片格式,其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。但是当我们加载图片到内存中将要显示出来的时候是不能使用压缩格式,这样就不能显示图片了。计算机依赖每一个像素点中的数据来显示图片。例如ios中的UIImange的每个像素点是由red+green+blue 三原色在加上alpha透明度组成的。三原色每一个的范围在0 ~ 255所以需要int8来存储一个值的大小。那么一个像素点的颜色就需要3*int8 在加上需要alpha的大小。alpha的范围是0 ~ 100 也是以int8来存储的。所以一个像素点就需要4个int8来存储,也就是一个int32的大小。

我们平时取颜色也可以看到这一点。一张图片由很多像素点组成每个像素点由rgb组成的。但是这里是取颜色可能获取不到alpha。那我们现在知道了每一个像素点的大小,得出一整张图片在内存中的大小就很容易了。width * height * int32 = 图片的内存大小。

解释一下这里bytesPerRow这个属性的意思,苹果官方文档上是这样描述的

所以bytesPerRow 返回的是一张图片一行所占用的内存大小。单位是bytes。
所以我们这里只需要在乘以图片的高度就OK了。如果要转换为kb直接在除以1024就OK了。基本就是一张图片在内存中占用的大小。以一张400 * 400的图片为例。
400 * (400 * 4) / 1024 = 625KB
其中400*4 = bytesPerRow的值

iOS获取UIImage内存大小

【中文标题】iOS获取UIImage内存大小【英文标题】:iOS get UIImage memory size 【发布时间】:2014-08-25 10:32:36 【问题描述】:

我想获取 UIImage 对象的实际内存大小。 有3种方法

NSUInteger s1 = UIImagePNGRepresentation(thumbImage).length;
NSUInteger s2 = UIImageJPEGRepresentation(thumbImage, 1).length;
NSUInteger s3  = CGImageGetHeight(thumbImage.CGImage) * CGImageGetBytesPerRow(thumbImage.CGImage);
NSLog(@"s1:%u",s1);
NSLog(@"s2:%u",s2);
NSLog(@"s3:%u",s3);

结果

s1:62734

s2:175939

s3:578816

哪个是对的?

【问题讨论】:

***.com/questions/6402614/… 【参考方案1】:

最后一个(s3)是正确的:

s1 是 .png 图像保存到文件时的大小 s2 是 .jpg 图像保存到最佳质量文件时的大小

【讨论】:

但是为什么保存到文件时jpg尺寸比png尺寸大,正常情况下应该是相反的。 您可以用 jpg 文件大小换取图像质量。 UIImageJPEGRepresentation compressionQuality 参数确定压缩量,范围从 0 到 1。在代码示例中,jpg 表示的质量设置为 1,或最高质量,这将产生最大的 jpg 文件。 PNG 是一种无损压缩,根据图像的不同,生成的文件大小可能比“高质量”的 jpg 文件更小。 @bobnoble 为什么内存和磁盘大小不同? @onmyway133 内存大小取决于照片的大小(宽度和高度)和深度(每像素字节数)。内存中的照片不会被压缩,因为 jpeg 或 png 照片在磁盘上。

以上是关于iOS uiimage内存占用大小计算的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中高效的加载图片

如何计算Java对象所占内存的大小

Bitmap占用内存大小的准确计算公式

构造UIimage的方法中,占用内存的最大的

YUV各种格式的像素占用内存大小计算

YUV各种格式的像素占用内存大小计算