今天突然遇到一个问题,UI给了很多设计图。但感觉很占内存。所以就想计算一下具体需要占用多少内存。
我们平时看到的png、jpg、webp这些图片格式,其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。但是当我们加载图片到内存中将要显示出来的时候是不能使用压缩格式,这样就不能显示图片了。计算机依赖每一个像素点中的数据来显示图片。例如iOS中的UIImange的每个像素点是由red+green+blue 三原色在加上alpha透明度组成的。三原色每一个的范围在0 ~ 255所以需要int8来存储一个值的大小。那么一个像素点的颜色就需要3*int8 在加上需要alpha的大小。alpha的范围是0 ~ 100 也是以int8来存储的。所以一个像素点就需要4个int8来存储,也就是一个int32的大小。
image.png
我们平时取颜色也可以看到这一点。一张图片由很多像素点组成每个像素点由rgb组成的。但是这里是取颜色可能获取不到alpha。那我们现在知道了每一个像素点的大小,得出一整张图片在内存中的大小就很容易了。width * height * int32 = 图片的内存大小。
if let imagea = UIImage.init(named: "ccc.png"){
let size = imagea.cgImage.height * imagea.cgImage.bytesPerRow
}
解释一下这里bytesPerRow这个属性的意思,苹果官方文档上是这样描述的
bytesPerRow
The number of bytes per row of pixels in the input image data.
所以bytesPerRow 返回的是一张图片一行所占用的内存大小。单位是bytes。
所以我们这里只需要在乘以图片的高度就OK了。如果要转换为kb直接在除以1024就OK了。基本就是一张图片在内存中占用的大小。以一张400 * 400的图片为例。
400 * (400 * 4) / 1024 = 625KB
其中400*4 = bytesPerRow的值
网友评论