圖片內(nèi)存占用計算公式
圖片分辨率 = a 意系,b 比如:18*12
圖片存放的文件夾對應的dpi 拱燃, 比如hdpi是240碎浇,xhdpi是320dpi 腾仅,我們定位為變量inDensity
手機設(shè)備的dpi乒裆,這個值取決于每臺手機,
比如我的小米10pro推励,是440dpi (這個值并不是手機分辨率的平方之和 鹤耍,開根號,再除以手機尺寸验辞,這個展示分辨率取決于廠商的算法),
我們定義為targetDensity
圖片縮放比例 scale= targetDensity / inDensity
每個像素點的內(nèi)存大小 pointMemory 稿黄,取決于色深,比如argb8888的色深就是32個bit位 = 4byte
圖片占用內(nèi)存 = (圖片寬a * scale + 0.5) * (圖片高 * scale +0.5) * pointMemory
同一張圖片跌造,展示在不同分辨率手機上杆怕,內(nèi)存占用大小一致嗎?
不一致。
因為inDensity的數(shù)值一致陵珍,但targetDensity的數(shù)值不一致寝杖,所以圖片的縮放比例不同,占用內(nèi)存自然不同
同一手機設(shè)備加載不同分辨率文件夾下的同一圖片撑教,內(nèi)存占用大小一致嗎朝墩?
一致。
雖然不同分辨率下的inDensity數(shù)值是不同的伟姐,但只要設(shè)計師是按照規(guī)范切的圖收苏,
那么不同分辨率圖片之間的寬高縮放比例 = inDensity之間的比例。
所以最終不同分辨率的圖片在同一設(shè)備上展示時愤兵,圖片寬高縮放后得到的最終值是一致的鹿霸,內(nèi)存也就一致了。
imageView控件的大小會影響內(nèi)存占用大小嗎秆乳?
不會懦鼠。
因為通過src屬性,我們在獲取對應的drawable時屹堰,設(shè)置的density為0肛冶,density為0的情況下,圖片的寬高是不會進行任何的縮放的扯键,故而占用內(nèi)存大小也不會有任何的改變睦袖。
內(nèi)存占用大小 = 圖片原始寬 * 圖片原始高 * 色深
同一個資源id,通過BitmapFactory創(chuàng)建的bitmap和xml文件中imageView設(shè)置的src荣刑,占用內(nèi)存是否一致馅笙?
會有不一致的場景。
如果inDensity和targetDensity不一致厉亏,那么通過BitmapFactory創(chuàng)建的bitmap會進行縮放董习,
從而導致 內(nèi)存大小 != 圖片原始寬 * 圖片原始高 * 色深。
而xml通過src屬性設(shè)置的圖片爱只,因為density = 0的原因皿淋,圖片不會進行任何的縮放
內(nèi)存大小 = 圖片原始寬 * 圖片原始高 * 色深
三方圖片加載框架設(shè)置圖片大小,是否會影響圖片占用內(nèi)存恬试?
會沥匈。
三方框架設(shè)置圖片大小的操作本質(zhì),是修改圖片的寬高忘渔,圖片的寬高變了,占用內(nèi)存大小自然也就變了
google圖片適配的規(guī)則
先找手機設(shè)備dpi對應的drawable文件夾缰儿,如果當前文件夾找不到畦粮,google的策略是優(yōu)先圖片縮小。
所以會接著去找高分辨率下文件夾有沒有這張圖片,高分辨率都沒有的情況下宣赔,會接著從低分辨文件夾中查找
比如:手機設(shè)備dpi 為320(xhdpi)预麸,如果在drawable-xhdpi文件中找不到對應圖片,
則接著去drawable-xxhdpi儒将、drawable-xxxhdpi文件夾中查找吏祸,
如果依然沒有找到,則去drawable-hdpi钩蚊、drawable-mdpi下查找
為什么建議圖片要放在正確的分辨率文件夾下贡翘?
只針對手機設(shè)備的分辨率是xxhdpi做分析,其余分辨率自行思考砰逻,targetDensity = 480
分辨率是xxhdpi的圖片鸣驱,放在正確的drawable-xxhdpi文件夾下。
inDensity = 480蝠咆,targetDensity = 480踊东,圖片縮放比例 scale = 1
分辨率是xxhdpi的圖片,放在錯誤的drawable-xhdpi文件夾下刚操。
inDensity = 320闸翅,targetDensity = 480,圖片縮放比例 scale = 1.5
內(nèi)存大小從 width * height * pointMemeory 變成了 (width * 1.5 + 0.5) * (height * 1.5 + 0.5) * pointMemory菊霜,
導致占用的內(nèi)存增加了許多
一個dpi為320的手機設(shè)備坚冀,加載一張drawable-xxxhdpi下的圖片,占用的內(nèi)存和加載一張drawable-xhdpi下的圖片一樣嗎占卧?
當然一樣遗菠,加載高分辨率圖片時,圖片是會縮小的华蜒,圖片大小會縮放到和其他分辨率一致辙纬,故而占用內(nèi)存大小是一致的
既然我們手機加載不同分辨率目錄下的同一圖片,占用內(nèi)存大小都是一致的叭喜,那為什么還要創(chuàng)建多個drawable目錄呢 贺拣? 直接使用drawable-xxxhdpi,豈不是還可以縮小包體積捂蕴?
這里涉及到一個問題俺夕,就是xml文件中我們使用imageView控件贡茅,直接通過src屬性引用圖片資源的場景.
而通過xml文件引用圖片資源,占用的內(nèi)存大小如下:
因為通過src屬性,我們在獲取對應的drawable時捌议,設(shè)置的density為0,density為0的情況下圣蝎,
圖片的寬高是不會進行任何的縮放的,故而占用內(nèi)存大小也不會有任何的改變腕够。
內(nèi)存占用大小 = 圖片原始寬 * 圖片原始高 * 色深
所以 如果我是320的手機,我加載xhdpi下的圖片舌劳,假設(shè)圖片是 18*12 argb8888 帚湘,那內(nèi)存占用就是 18*12*4
但如果我只在xxxhdpi下有圖片,假設(shè)圖片是36*24 甚淡, 那內(nèi)存占用就是36*24 * 4大诸,內(nèi)存占用一下就翻了4倍.
而我們drawable目錄下的 圖片,幾乎都是用于xml引用圖片贯卦,很少會用bitmapFactory創(chuàng)建资柔,
所以還是每個文件夾下都放對應分辨率的圖片是最好的
圖片的釋放
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者