您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何在運(yùn)行時獲取Bitmap的大小的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇如何在運(yùn)行時獲取Bitmap的大小文章都會有所收獲,下面我們一起來看看吧。
獲取圖片實(shí)際需要的內(nèi)存大小
public final int getByteCount() {if(mRecycled) {return 0;}return getRowBytes() * getHeight();}
圖片實(shí)際占用的內(nèi)存大小
因為存在一個復(fù)用的場景,比如之前已經(jīng)開辟了400KB的大小用來顯示圖片A,現(xiàn)在我們需要顯示300KB的圖片B,而且圖片A已經(jīng)不需要顯示了,那么可能就會將之前開辟的400KB用來顯示圖片B,這樣就不需要重新開辟新的內(nèi)存,所以圖片B實(shí)際占用的內(nèi)存400KB。
public final int getAllocationByteCount() {if(mRecycled) {return 0;}return nativeGetAllocationByteCount(mNativePtr);}
Assets中的圖片
asstes中的文件基本等同于我們從SDCard中加載的圖片,所以就不再單獨(dú)講解了。
舉個例子:我們以寬高為112px * 131px像素的png圖片為例(文件大小為20kb),如果我們使用下面的方式加載到內(nèi)存中:
BitmapFactory.decodeStream(assets.open("test.png"));
實(shí)際上展示的是:以ARGB_8888的格式加載到內(nèi)存中,那么最終的大小是112*131*4 = 58688KB。實(shí)際上就是我們圖片需要顯示的總的像素點(diǎn)數(shù)乘以單個像素點(diǎn)所占用的內(nèi)存,因為ARGB_8888,可以看出來一個像素的四個通道分別需要8位來描述,所以一個像素點(diǎn)需要4個字節(jié)的內(nèi)存,所以總的像素點(diǎn)數(shù)乘以4就是這張圖所占用的總內(nèi)存了。
所以,意味著圖片的內(nèi)存大小除了像素大小外,還和加載到內(nèi)存的格式有關(guān),比如我們將上面的圖片換成RGB_565去加載,那么我們得出的內(nèi)存就應(yīng)該是:112*131*[(5_6+5)/8] = 112*131*2 = 29344個字節(jié),足足比之前小了一半的大小。
Drawable目錄中的圖片
當(dāng)我們將圖片放到不同的drawable目錄中,最后顯示出來占用的實(shí)際像素是有一定的縮放關(guān)系的,還是以112*131px的圖片為例:
這么說吧,如果將上面的圖片放到hdpi目錄下,然后以ARGB_8888加載到內(nèi)存中占用的內(nèi)存大小算法就如下:
(112÷1.5)×(131÷1.5)× 3 × 4 = 77256字節(jié)
注意如果放在-nodpi中,那么圖片在不同DPI的設(shè)備中不會做任何縮放,都只會以112×131的像素顯示,所以在不同手機(jī)中永遠(yuǎn)占用相同的內(nèi)存。
使用inSampleSize對圖片進(jìn)行采樣、壓縮
使用矩陣變化來改變圖片大小
使用RGB_565來加載非透明圖片
使用 9-patch圖片來做背景圖
使用VectorDrawable
能不用圖片就不用圖片
關(guān)于“如何在運(yùn)行時獲取Bitmap的大小”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“如何在運(yùn)行時獲取Bitmap的大小”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。