亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android開發(fā)中Bitmap高效加載使用詳解

 更新時間:2017年12月13日 08:43:25   作者:zzqFive  
在Android開發(fā)中,我們經(jīng)常與Bitmap打交道,而對Bitmap的不恰當(dāng)?shù)牟僮鹘?jīng)常會導(dǎo)致OOM(Out of Memory)。這篇文章我們會介紹如何高效地在Android開發(fā)中使用Bitmap,在保證圖片顯示質(zhì)量的前提下盡可能占用更小的內(nèi)存。

由于Android對單個應(yīng)用所施加的內(nèi)存限制,比如16MB,這導(dǎo)致加載Bitmap的時候很容易出現(xiàn)內(nèi)存溢出,本文主要包含2個方面的內(nèi)容分析Bitmap內(nèi)存和Bitmap高效加載

一、占用內(nèi)存

獲取bitmap的內(nèi)存,android提供的方法bitmap.getByteCount()
假如現(xiàn)在mipmap-xhdpi 目錄下,有一個 200 * 200 像素的圖片,運行加載它,看它輸出的尺寸。

Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.btn_go);
bitmap.getByteCount()的輸出結(jié)果為360000
現(xiàn)在把圖片轉(zhuǎn)移到mipmap-xxhdpi 中
bitmap.getByteCount的輸出結(jié)果為160000
那么mipmap-xhdpi 目錄下為何會大這么多呢?

density 影響 Bitmap 內(nèi)存
放在不同的 mipmap 目錄下,對應(yīng)的不同 density 的設(shè)備。density 是設(shè)備的固有參數(shù),伴隨著 density 的,還有 densityDpi,它也是與設(shè)備相關(guān)的,表示屏幕每英寸對應(yīng)多少個點(非像素點)

上面是官方提供的一張比較經(jīng)典的圖,可以看到,不同的目錄,代表不同的 density ,例如 xhdpi 代表的 density 就是 2。而這里的 density 對 densityDip 的基準(zhǔn)是 160 ,也就是說,mdpi 對應(yīng)的 densityDpi 是 160 ,xhdpi 對應(yīng)的 densityDpi 是 320,同樣xxhdpi對應(yīng)的densityDpi是480

density 和 densityDpi 在 Android 中,都有標(biāo)準(zhǔn)的 API 可以拿到,如下。

DisplayMetrics displayMetrics=new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
Log.i(TAG, displayMetrics.densityDpi+"");
Log.i(TAG,displayMetrics.density+"");

這是我手機的輸出結(jié)果

densityDpi:480
density:3.0

從getByteCount()源碼得知,Bitmap.getByteCount() 是由:
(bitmapWidth * scale) * (bitmapHeight * scale) *(每像素所占字節(jié)大小)得出來的
其中:int scale = phoneDensity / inDensity
phoneDensity是我們手機的densityDpi,上述得出我手機是480
inDensity是你圖片存放的路徑,比如xhdpi是320,xxhdpi是480
BitmapFactory默認(rèn)色彩度為 ARGB_8888 圖片,每像素會占用 4 bytes
在xhdpi下:200 * (480/320) * 200(480/320)4= 360000
在xxhdpi下:200 * (480/480) * 200(480/480)4= 160000

以上就是bitmap所占內(nèi)存分析。

二、高效加載

1.修改bitmap.config
2.修改inSampleSize

bitmap.config簡介

上面提到BitmapFactory默認(rèn)色彩度為 ARGB_8888

Bitmap.Config一共有四個參數(shù)如下:
(這些參數(shù)決定了Bitmap位圖的配置,會影響到bitmap的像素如何、色彩、以及是否有透明度的能力)

Bitmap.Config ALPHA_8

這個參數(shù)每個像素占用1字節(jié)的空間。
它代表每個像素點被存儲為單個透明度的通道,這對于設(shè)置遮罩的圖片用例十分有用,它不存儲顏色信息。

Bitmap.Config RGB_565

這個參數(shù)每個像素占用2字節(jié)的空間。
它代表只有RGB通道的編碼,其中紅色占用5位地址,綠色占用6位地址,藍(lán)色占用5位地址。沒有透明度的通道。
使用不透明的位圖時,不要求高的色彩保真度使用此配置是不錯的選擇。

Bitmap.Config ARGB_4444

這個參數(shù)每個像素占用2字節(jié)的空間。
它一共有四個通道,顧名思義,分別是透明度、紅、綠、藍(lán)。每個通道分別占用四位地址,所以一共2字節(jié)。
當(dāng)應(yīng)用需要節(jié)省內(nèi)存(對色彩質(zhì)量要求低),同時又需要存儲透明度信息,這個配置可以作為選擇,但官方比較推薦用ARGB_8888的設(shè)置,因為這個的色彩質(zhì)量差。

Bitmap.Config ARGB_8888

這個參數(shù)每個像素占用4字節(jié)的空間。
這也是一共4個通道,但不一樣的是每個通道站8位地址,因而色彩質(zhì)量比上一個設(shè)置高了特別特別多(16倍)。
能夠滿足最好的位圖質(zhì)量,在內(nèi)存充足的情況下,十分推薦使用這個。

inSampleSize簡介

通過BitmapFactory.Options來縮放圖片,主要是用inSampleSize參數(shù),當(dāng)inSampleSize=1時,采樣后的圖片為圖片的原始大小,當(dāng)inSampleSize=2時,采樣后的圖片寬,高均為原圖大小的1/2,而像素數(shù)為原圖的1/4,假定圖片原有的內(nèi)存是4MB,如果把它的inSampleSize設(shè)為2,它的內(nèi)存就會變成1MB
具體實現(xiàn)代碼如下

 public static Bitmap decodeBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight){
  final BitmapFactory.Options options=new BitmapFactory.Options();
  options.inJustDecodeBounds=true;
  BitmapFactory.decodeResource(res,resId,options);
  options.inSampleSize=1;
  options.inSampleSize=setInSampleSize(options,reqWidth,reqHeight);
  options.inPreferredConfig= Bitmap.Config.ARGB_4444;
  options.inJustDecodeBounds=false;
  return BitmapFactory.decodeResource(res,resId,options);
 }

 public static int setInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){
  final int height=options.outHeight;
  final int width=options.outWidth;
  int inSampleSize=1;
  if(height>reqHeight||width>reqHeight){
   final int halfHeght=height/2;
   final int halfWidht=width/2;
   while ((halfHeght/inSampleSize>=reqHeight)&&(halfWidht/inSampleSize>=reqWidth)){
    inSampleSize *=2;
   }
  }
  return inSampleSize;
 }

有了上面兩個方法,實際使用就簡單了,比如imageView所期望的圖片大小為100X100,這個時候我們就可以這樣調(diào)用,還是之前存放在xxhdpi中的圖片,上述代碼中已經(jīng)把bitmap.config設(shè)置成ARGB_4444 ,現(xiàn)在把原先尺寸200X200改成100X100,看下內(nèi)存是多少

Bitmap bitmap=
decodeBitmapFromResource(getResources(),R.mipmap.btn_go,100,100);
Log.i(TAG,bitmap.getByteCount()+"");

bitmap.getByteCount的輸出結(jié)果為20000,比之前160000減少了8倍, ARGB_4444較ARGB_8888減少了2倍,設(shè)置尺寸100,100傳入setInSampleSize()方法中得到inSampleSize=2, 像素數(shù)為原圖的1/4,內(nèi)存大小總共就變成了之前的1/8,這樣高效加載圖片,就會遠(yuǎn)離oom。

相關(guān)文章

  • Android自定義View仿微信LetterView效果

    Android自定義View仿微信LetterView效果

    這篇文章主要介紹了Android自定義View仿微信LetterView效果,代碼簡單易懂,非常不錯,具有參考借鑒借鑒價值,需要的朋友可以參考下
    2017-03-03
  • Android自定義短信驗證碼組件

    Android自定義短信驗證碼組件

    這篇文章主要為大家詳細(xì)介紹了Android自定義短信驗證碼組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Android GestureDetector手勢滑動使用實例講解

    Android GestureDetector手勢滑動使用實例講解

    這篇文章主要為大家詳細(xì)介紹了Android GestureDetector手勢滑動使用實例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android Volley框架使用方法詳解

    Android Volley框架使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Android Volley框架使用方法,從網(wǎng)絡(luò)請求和圖片加載兩大方面進(jìn)行分析,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android仿微信左右滑動點擊切換頁面和圖標(biāo)

    Android仿微信左右滑動點擊切換頁面和圖標(biāo)

    這篇文章主要為大家詳細(xì)介紹了Android仿微信左右滑動點擊切換頁面和圖標(biāo),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android 實例開發(fā)基于ArcSoft實現(xiàn)人臉識別

    Android 實例開發(fā)基于ArcSoft實現(xiàn)人臉識別

    人臉識別,是基于人的臉部特征信息進(jìn)行身份識別的一種生物識別技術(shù)。用攝像機或攝像頭采集含有人臉的圖像或視頻流,并自動在圖像中檢測和跟蹤人臉,進(jìn)而對檢測到的人臉進(jìn)行識別的一系列相關(guān)技術(shù),通常也叫做人像識別、面部識別
    2021-11-11
  • 詳解android 通過uri獲取bitmap圖片并壓縮

    詳解android 通過uri獲取bitmap圖片并壓縮

    這篇文章主要介紹了詳解android 通過uri獲取bitmap圖片并壓縮的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • Android圖片緩存之Bitmap詳解(一)

    Android圖片緩存之Bitmap詳解(一)

    這篇文章主要為大家詳細(xì)介紹了Android圖片緩存之Bitmap,點學(xué)習(xí)一下Bitmap、BitmapFactory這兩個類,感興趣的小伙伴們可以參考一下
    2016-08-08
  • LayoutAnimation給ListView中的item設(shè)置動態(tài)出場效果(實例)

    LayoutAnimation給ListView中的item設(shè)置動態(tài)出場效果(實例)

    下面小編就為大家?guī)硪黄狶ayoutAnimation給ListView中的item設(shè)置動態(tài)出場效果(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Android實現(xiàn)簡易計算功能

    Android實現(xiàn)簡易計算功能

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)簡易計算功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論