今天突然遇到一個問題冒萄,UI給了很多設計圖。但感覺很占內存橙数。所以就想計算一下具體需要占用多少內存尊流。
我們平時看到的png、jpg灯帮、webp這些圖片格式崖技,其實都是圖片壓縮格式。通過對應的算法來優(yōu)化了大小以節(jié)省網絡傳輸與本地保存所需的資源施流。但是當我們加載圖片到內存中將要顯示出來的時候是不能使用壓縮格式响疚,這樣就不能顯示圖片了。計算機依賴每一個像素點中的數據來顯示圖片瞪醋。例如iOS中的UIImange的每個像素點是由red+green+blue 三原色在加上alpha透明度組成的忿晕。三原色每一個的范圍在0 ~ 255所以需要int8來存儲一個值的大小。那么一個像素點的顏色就需要3*int8 在加上需要alpha的大小银受。alpha的范圍是0 ~ 100 也是以int8來存儲的践盼。所以一個像素點就需要4個int8來存儲,也就是一個int32的大小宾巍。
我們平時取顏色也可以看到這一點咕幻。一張圖片由很多像素點組成每個像素點由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的值