Bitmap那些事之內(nèi)存占用計(jì)算和加載注意事項(xiàng)-創(chuàng)新互聯(lián)

前言:本來我是做電視應(yīng)用的,但是因?yàn)楣疽鍪謾C(jī),人員緊張,所以就抽調(diào)我去支援一下,誰叫俺是雷鋒呢!Bitmap那些事之內(nèi)存占用計(jì)算和加載注意事項(xiàng)我做的一個(gè)功能就是處理手機(jī)中的應(yīng)用ICON,處理無非就是美化一下,重新與底板進(jìn)行合成和裁剪,用到了很多Bitmap的知識(shí)。本來之前一直想寫一些關(guān)于Bitmap的博客,正好這是個(gè)機(jī)會(huì),因此Bitmap那些事系列博客誕生了。這個(gè)系列我會(huì)把學(xué)習(xí)Bitmap的一些知識(shí)發(fā)布出來供大家參考和交流。

專注于為中小企業(yè)提供成都網(wǎng)站制作、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)葉集免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

    在手機(jī)中圖片一般都是指Bitmap圖片,為什么要說Bitmap呢?因?yàn)榇蠹以陂_發(fā)應(yīng)用的時(shí)候,都會(huì)使用一些圖片來表現(xiàn)UI,用戶也喜歡看圖片,看文字獲取信息太慢并且不直觀,如果美工設(shè)計(jì)的好,看圖片基本上不怎么看你的文字內(nèi)容就知道你要表達(dá)什么,例如所有的購物網(wǎng)站都會(huì)編輯很多商品的配圖來呈現(xiàn)給用戶,由此可見圖片在應(yīng)用程序中的常見和重要。只要說到圖片就不能離開如何避免OOM這個(gè)主題,因?yàn)樵谔幚砗芏鄨D片時(shí)很容易出現(xiàn)OOM,那么學(xué)習(xí)圖片處理就顯得尤為重要了,下面就讓我們一步一步學(xué)習(xí)圖片的相關(guān)知識(shí)。

Bitmap圖片占用內(nèi)存計(jì)算:

    Bitmap圖片在加載到內(nèi)存的時(shí)候是按照:寬*高*像素點(diǎn)位數(shù)來計(jì)算的。你可以把圖片看成是由width行、height列的矩陣組成,每一個(gè)矩陣元素代表一個(gè)像素點(diǎn),每一個(gè)像素點(diǎn)都是1byte整數(shù)倍的數(shù)據(jù),這個(gè)數(shù)據(jù)越大,表示的色彩就越豐富,圖片的顯示質(zhì)量就越高。Bitmap中有一個(gè)枚舉類Config用來配置圖片的壓縮格式,代表每個(gè)像素是用多大的數(shù)據(jù)來存儲(chǔ)的,數(shù)值越大能夠存儲(chǔ)的顏色信息就越多,也就越豐富,顯示效果也就越好。Config.ALPHA_8是1 byte,Config.RGB_565和Config.ARGB_4444都是2 bytes,Config.RGB_565沒有Alpha值所以多用來配置沒有透明度的圖片,Config.ARGB_8888是4 bytes,一般圖片都是按照這個(gè)來配置的。下面是獲取配置的代碼:

static int getBytesPerPixel(Config config) {
    if (config == Config.ARGB_8888) {
        return 4;
    } else if (config == Config.RGB_565) {
        return 2;
    } else if (config == Config.ARGB_4444) {
        return 2;
    } else if (config == Config.ALPHA_8) {
        return 1;
    }
    return 1;
}

使用圖片你需要注意哪些:

1、android系統(tǒng)自身的問題。android系統(tǒng)給每一個(gè)應(yīng)用分配了一定的內(nèi)存空間,分配了多少要看廠家和機(jī)型,數(shù)值可以通過Runtime類獲取,Runtime.getRuntime()獲取實(shí)例,然后通過maxMemory()方法獲取系統(tǒng)可為APP分配的大內(nèi)存,totalMemory() 獲取APP當(dāng)前所分配的內(nèi)存heap空間大小,freeMemory()獲取當(dāng)前可用的內(nèi)存,當(dāng)被耗盡時(shí)會(huì)自動(dòng)擴(kuò)張,但是不會(huì)超過maxMemory。下圖為google官網(wǎng)提供的不同分辨率下不同的dpi分配的最小內(nèi)存;

Bitmap那些事之內(nèi)存占用計(jì)算和加載注意事項(xiàng)

Bitmap那些事之內(nèi)存占用計(jì)算和加載注意事項(xiàng)

Bitmap那些事之內(nèi)存占用計(jì)算和加載注意事項(xiàng)

2、需要多大的照片。很多圖片其實(shí)在手機(jī)上顯示的時(shí)候不需要完全把原圖加載到內(nèi)存中,比如我手機(jī)相機(jī)拍了一張照片是4208*3120的,加載到內(nèi)存中占用的內(nèi)存就是52M,這是很恐怖的,兩張照片差不多就把你的app內(nèi)存給耗光了。一般情況下你都需要對需要加載的圖片進(jìn)行處理,這個(gè)處理主要是減小圖片尺寸,降低分辨率,比如你的控件顯示就是100*100的大小,那你就要把圖片縮小到100*100。

3、及時(shí)釋放內(nèi)存。安卓2.3.3(API級別10)之前,Bitmap像素?cái)?shù)據(jù)和Bitmap對象是分開存儲(chǔ)的,像素?cái)?shù)據(jù)是存儲(chǔ)在native memory中,對象存儲(chǔ)在Dalvik heap中,native memory中的像素?cái)?shù)據(jù)不是以一種可預(yù)見的方式釋放,可能導(dǎo)致應(yīng)用程序暫時(shí)超過其內(nèi)存限制和崩潰,所以在Android2.3.3(API 10)之前你必須要調(diào)用recycle()方法來釋放掉內(nèi)存避免出現(xiàn)OOM,當(dāng)然前提是確定這個(gè)bitmap不再使用,否則會(huì)出現(xiàn) "Canvas: trying to use a recycled bitmap". 在Android3.0(API 11)之后,Bitmap的像素?cái)?shù)據(jù)和Bitmap對象一起存儲(chǔ)在Dalvik heap中,所以我們不用手動(dòng)調(diào)用recycle()來釋放Bitmap對象,內(nèi)存的釋放都交給垃圾回收器來做。

    以上是學(xué)習(xí)Bitmap的一些基礎(chǔ)知識(shí)和加載到手機(jī)內(nèi)存中需要注意的事項(xiàng),下一篇博客我會(huì)寫如何更好的加載Bitmap,怎樣省內(nèi)存,怎樣高效。謝謝大家的瀏覽,寫的不好的地方和有任何疑問請留言或者更快的與我交流請?zhí)砑樱?strong>coder_online公眾號,這里不僅有我的文章,還有我的小伙伴們的,各種技術(shù)分享,不妨你來看看,我們期待你的到來。也可以掃描下面的二維碼,duang的一下就找到我們了。。。。。。。

Bitmap那些事之內(nèi)存占用計(jì)算和加載注意事項(xiàng)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文標(biāo)題:Bitmap那些事之內(nèi)存占用計(jì)算和加載注意事項(xiàng)-創(chuàng)新互聯(lián)
文章路徑:http://bm7419.com/article44/dihdhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、用戶體驗(yàn)域名注冊、企業(yè)網(wǎng)站制作、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)