您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何高效利用Bitmap”,在日常操作中,相信很多人在如何高效利用Bitmap問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何高效利用Bitmap”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
背景:圖片加載在項目中是隨處可見,而圖片加載在很多情況下需要用到Bitmap(位圖)這個類。Bitmap可以說是一個“大胖子”,因為Bitmap自身會將圖片每個像素的屬性全部保存在內存中。這就會導致我們稍有不慎就會創建出一個占用內存很大的Bitmap對象,從而導致加載速度過慢,常見表現為OOM(Out of Memory)。
有必要對Bitmap進行優化,從而降低出現Crash情況的概率,提高app的加載圖片速度,增強APP穩定性。
舉個栗子
上面的代碼經常在我們的項目中出現。你可知其背后的處理邏輯?
根據源碼可知,上面的代碼中兩個方法setBackgroundResource()
和setImageResource()
是使用Bitmap作為過渡處理的。在運行時,上面的兩個方法會使用BitmapFactory.decodeStream()方法將資源圖片生成一個Bitmap,然后由這個Bitmap生成一個Drawable,最后再將這個Drawable設置到ImageView。
如果運用以上代碼,在加載的圖片的尺寸遠大于ImageView的尺寸,你會發現控件加載圖片非常緩慢。你使用在ListView或RecycleView中批量加載一些未知size的圖片的時候,你會發現會出現卡頓的情況。
BitmapFactory是谷歌官方為我們開發者提供加載圖片方式的類,它可以從文件、圖片傳輸流、字節數組這三種方式中加載圖片。
要實現高效加載Bitmap,首先我們要了解Options類的幾個參數,因為正是通過合理的配置這幾個參數,我們才能夠實現高效的加載Bitmap對象。Options類是BitmapFactory的一個靜態內部類,我們來看一下它的源碼:
幾個名詞解釋下:
屏幕密度
屏幕密度分為相對屏幕密度和絕對屏幕密度 density
:可以理解為相對屏幕密度,我們知道,1個DIP在160dpi的屏幕上大約為1像素大小。我們以160dpi為基準線,density的值即為相對于160dpi屏幕的相對屏幕密度。比如,160dpi屏幕的density值為1, 320dpi屏幕的density值為2 densityDpi
:可以理解為絕對屏幕密度,也就是實際的屏幕密度值(dots per inch),比如160dpi屏幕的densityDpi值就是160
縮放系數
Options類中存在一個inScaled參數,這個參數表示是否支持縮放,我們從Options的默然構造方法中可以看到這個參數被初始化為了true,也就是說默認是支持縮放的。那么將如何進行縮放呢?答案是根據縮放系數進行縮放。關于縮放系數的計算方法,其實我們在講解如何計算內存中Bitmap的大小時已經介紹過了。縮放系數就是inTargetDensity除以inDensity。inDensity表示我們的圖片所處的資源文件夾對應的dpi,inTargetDensity表示目標設備的屏幕密度。
采樣率(inSampleSize)
當這個參數為1時,采樣后的圖片大小和原來一樣;當這個參數為2時,采樣后的圖片寬高均為原來的1/2,大小也就成了原來的1/4。也就是說,采樣后的大小等于原始大小除以采樣率的平方。官方文檔規定,inSampleSize的值應為2的非負整數次冪(1,2,4,… ),否則會被系統向下取整并找到一個最接近的值。通過設置inSampleSize我們就能夠將圖片縮放到一個合理的大小
1.獲取圖片的原始寬高
通過將Options的inJustDecodeBounds屬性設為true后調用decodeResource方法,可以實現不真正加載圖片而只是獲取圖片的尺寸信息
2、根據原始寬高計算出inSampleSize,代碼如下:
3、根據計算出的inSampleSize生成Bitmap
4、調用以上的decodeSampledBitmapFromResource方法,使用自定尺寸的Bitmap。 如果你要將一張大圖設置為一個250*250的縮略圖,執行以下代碼:
到此,關于“如何高效利用Bitmap”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。