iOS uiimage内存占用大小计算

iOS uiimage内存占用大小计算,第1张

今天突然遇到一个问题,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的值

实现思路为先获得我们需要转换的UIImage,再使用原生的方法 UIImageJPEGRepresentation(image, 0.5f)或者 UIImagePNGRepresentation 获得转换后的NSData,其中,UIImageJPEGRepresentation的第二个参数为一个CGFloat,代表压缩率。前者返回格式为JPEG的image的NSData,后者返回PNG的image的NSData。

如若有继续转换为NSString的需求,则使用 [yourImageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]方法获得NSString。

至此转换完毕。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9665530.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存