Bitmap的優化及高效載入

2021-10-06 07:00:31 字數 1577 閱讀 3912

bitmap即位圖。在android中要處理要位圖的載入顯示並不容易,需要嫻熟的管理的裝置記憶體,否則很容易因為點陣圖的載入不恰當占用了應用大量寶貴的記憶體空間,更嚴重的導致應用oom。因此學習好如何高效的載入記憶體十分重要。幸好,現在有許多十分強大的載入框架,它們能夠高效順暢的載入位圖,使用起來也非常方便,譬如glide,picasso等。本文也暫時不去分析這些框架的原始碼(沒複習到,也真的很複雜,不是三言兩語能說明白的)。

bitmap的載入優化呢,大概有三種:

1.採用質量較低(低色彩)的點陣圖。譬如rgb_565每個畫素佔2個位元組,argb_8888每個畫素佔4個位元組。

2.將不同畫素放到對應的drawable目錄下。

這兩個答案有個博主的文章說的十分詳細(真大佬)

3.載入經過縮略後的點陣圖。

第3種方法能夠節約位圖占用的記憶體是很明顯的。前面兩步在日常的開發中都應該能夠不犯錯誤,即使前兩種方法都做到了記憶體優化,但是的畫素仍然比較大,譬如4048*3036畫素,質量為rgb_565,位圖載入記憶體中仍然需要4048*3036*2 大約24m的記憶體,即使是現在的手機有6g執行記憶體,一張要佔據24m的記憶體還是不能讓人滿意的。因此,我們要做到更加高效的載入位圖。

通常我們解碼點陣圖的時候都會呼叫bitmapfactory的一系列decode***()方法,這些decode***()方法最後後會呼叫底層native方法去解碼位圖。

底層解碼點陣圖會試圖為位圖分配記憶體空間,所以在我們呼叫解碼方法的時候,要先設定bitmapfactory.option類的屬性injustdecodebounds為true, 可避免記憶體分配。

這段**可以在不分配記憶體就可以獲取點陣圖的尺寸(寬,高,型別)。在得知了點陣圖的寬高之後我們就可以對位圖進行縮略在載入到控制項上。

為什麼insamplesize要為2的n次冪呢?是因為解碼器使用的最終值將向下捨入為最接近的 2 的冪,也就是說我們最終在native方法去解碼的時候,使用這個縮略大小insamplesize是向下捨入為最接近的 2 的冪。具體可以看看這個insamplesize文件說明。

最終我們可以得出高效載入點陣圖的方法。

mivbeauty.setimagebitmap(decodesampledbitmapfromresource(getresources(), r.id.iv_beauty, 100, 100));

private bitmap decodesampledbitmapfromresource(resources resources, int resid, int reqwidth, int reqheight)

Bitmap的高效載入

如何高效的載入乙個bitmap,這是乙個很有意義的話題,因為在我們開發的過程中,經常會遇到這樣錯誤 outofmemoryerror 這樣的錯誤,很多時候都是因為載入bitmap出現的記憶體溢位.如何載入乙個bitmap bitmap在andriod中指的是一張,那麼如何載入乙個?bitmapfac...

如何高效載入bitmap

對於如何高效載入bitmap,就是採用bitmapfactory.options來載入所需的大小。通過bitmapfactory.options來對進行縮放,主要利用其insamplesize引數,即取樣率。獲取取樣率的步驟一般如下 1 將bitmapfactory.options的injustde...

Bitmap的高效載入和LruCache快取

本部落格 android應用程式都是有一定記憶體限制的,程式占用了過高的記憶體就容易出現oom outofmemory 異常。因此在展示高解析度的時候,最好先將進行壓縮。壓縮後的大小應該和用來展示它的控制項大小相近。bitmapfactory類提供了四類方法 decodefile decoderes...