內(nèi)存泄漏優(yōu)化---Bitmap優(yōu)化

原文鏈接:http://blog.csdn.net/u012810020/article/details/51729264

理論部分

一、 如何加載一個(gè)Bitmap

Bitmap在Android中指的是一張圖片饵溅,可以使PNG格式也可以是JPG等常見的其他圖片的格式。Android提供了四類方法加載Bitmap:decodeFile、decodeResource髓削、decodeStream和decodeByteArray驯用。分別用于從文件系統(tǒng)驼鞭、資源、輸入流以及字節(jié)數(shù)組中加載一個(gè)Bitmap對(duì)象衫贬,其中decideFile和decodeResource又間接調(diào)用了decodeStream方法德澈。

高效加載Bitmap思想:采用BitmapFactory.Options來(lái)加載所需尺寸的圖片。通過(guò)Bitmap.Options來(lái)縮放圖片固惯,主要使

用它的inSampleSize參數(shù)梆造,即采樣率。當(dāng)inSampleSize為1時(shí)葬毫,采用后的圖片大小為原始圖片大姓蚧浴;當(dāng)inSampleSize的至大

于1時(shí)贴捡,比如為2忽肛,那么采樣后的圖片的寬和高均為原來(lái)的1/2,而像素為原始的1/4,其占有的內(nèi)存大小也為原來(lái)的1/4烂斋。拿一張1024*1024像素

的圖片來(lái)說(shuō)屹逛,假定采用ARGB8888格式存儲(chǔ)础废,那么它占有的內(nèi)存為1024x1024x4,即4M煎源,如果inSampleSize為2色迂,那么采樣后的圖

片占有內(nèi)存為512x512x4,即1M手销。

二歇僧、實(shí)際問題

我們來(lái)考慮一下實(shí)際問題:比如ImageView的大小是100x100像素,而原始圖片的大小為200x200像素锋拖,那么只需要將采樣率

inSampleSize設(shè)置為2就OK了诈悍,但是如果圖片大小為200x300呢?這個(gè)時(shí)候的采樣率仍設(shè)置為2兽埃,這樣縮放后的圖片大小為100x150像

素侥钳,仍然是適合ImageView的,如果采樣率為3柄错,那么縮放后的圖片的大小就會(huì)小于ImageView所期望的大小舷夺,這樣圖片就會(huì)被拉伸從而導(dǎo)致模

糊。

通過(guò)采樣率加載圖片售貌,主要的就是計(jì)算出合適的采樣率给猾,計(jì)算采樣率的一般流程:

①將BitmapFactory.Options的inJustDecodeBounds參數(shù)設(shè)置為true并加載圖片。

②從BitmapFactory.Options中取出原始圖片的寬高信息颂跨。

③根據(jù)采樣率的規(guī)則并結(jié)合目標(biāo)View所需大小計(jì)算出采樣率inSampleSize敢伸。

④將BitmapFactory.OPtions的參數(shù)設(shè)置為false并重新加載圖片。

通過(guò)上面4個(gè)步驟恒削,加載出的圖片就是最終縮放的圖片池颈,當(dāng)然也有可能不需要縮放。這里解釋一下inJustDecodeBounds參數(shù)钓丰,當(dāng)參數(shù)為true

時(shí)躯砰,BitmapFactory只會(huì)解析圖片的原始寬高信息,并不會(huì)真正的去加載圖片携丁。所以這個(gè)操作是輕量級(jí)的弃揽。另外需要注意的是,這個(gè)時(shí)候

BitmapFactory獲取的圖片寬高信息和圖片的位置以及程序運(yùn)行的設(shè)備有關(guān)则北,比如同一張圖片放在不同的drawable文件夾目錄下或者程序運(yùn)行

在不同的屏幕密度的設(shè)備上矿微,這樣導(dǎo)致BitmapFactory獲取到不同的結(jié)果。

代碼實(shí)現(xiàn)

[html]view plaincopy

/**

*?類描述:Bitmap壓縮工具類

*?Created?by?lizhenya.

*/

public?class?BitmapHelper?{

/**

*?方法描述:壓縮Resources類型的Bitmap

*

*?@param?resources?Class?for?accessing?an?application's?resources.

*?@param?resId?????圖片資源的ID

*?@param?reqWidth??Bitmap目標(biāo)壓縮寬度像素值

*?@param?reqHeight?Bitmap目標(biāo)壓縮高度像素值

*?@return?壓縮后的Bitmap類型的圖片

*/

public?static?Bitmap?decodeSampleBitmapFromResouce(Resources?resources,?int?resId,?int?reqWidth,?int?reqHeight)?{

//First?decode?withinJustDecodeBounds=trueto?check?dimension

BitmapFactory.Optionsoptions=newBitmapFactory.Options();

options.inJustDecodeBounds=true;

BitmapFactory.decodeResource(resources,?resId,?options);

//Caculate?inSampleSize

options.inSampleSize=caculateInSampleSize(options,?reqWidth,?reqHeight);

options.inJustDecodeBounds=false;

return?BitmapFactory.decodeResource(resources,?resId,?options);

}

/**

*?方法描述:計(jì)算采樣率inSampleSize的值

*

*?@param?options???BitmapFactory.Options實(shí)例

*?@param?reqWidth??Bitmap目標(biāo)壓縮寬度像素值

*?@param?reqHeight?Bitmap目標(biāo)壓縮高度像素值

*?@return?采樣率inSampleSize的值

*/

private?static?int?caculateInSampleSize(BitmapFactory.Options?options,?int?reqWidth,?int?reqHeight)?{

//Raw?height?and?width?of?image

intheight=options.outHeight;

intwidth=options.outWidth;

Log.e("TAG","Rawheight="+height);

Log.e("TAG","Rawwidth="+width);

intinSampleSize=1;

if?(height>reqHeight?||?width>reqWidth)?{

inthalfWidth=width/?2;

inthalfHeight=height/?2;

while?(halfHeight?/?inSampleSize>=?reqHeight?&&?halfWidth?/?inSampleSize>=?reqWidth)?{

inSampleSize?*=?2;

}

}

return?inSampleSize;

}

}

這篇博客主要討論的是Bitmap的加載尚揣,關(guān)于Bitmap的優(yōu)化還有一個(gè)重要的技術(shù)點(diǎn):Bitmap的緩存涌矢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市快骗,隨后出現(xiàn)的幾起案子娜庇,更是在濱河造成了極大的恐慌塔次,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件名秀,死亡現(xiàn)場(chǎng)離奇詭異励负,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)匕得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門继榆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人汁掠,你說(shuō)我怎么就攤上這事略吨。” “怎么了考阱?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵翠忠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我乞榨,道長(zhǎng)秽之,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任吃既,我火速辦了婚禮政溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘态秧。我一直安慰自己,他們只是感情好扼鞋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布申鱼。 她就那樣靜靜地躺著,像睡著了一般云头。 火紅的嫁衣襯著肌膚如雪捐友。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天溃槐,我揣著相機(jī)與錄音匣砖,去河邊找鬼。 笑死昏滴,一個(gè)胖子當(dāng)著我的面吹牛猴鲫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谣殊,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼拂共,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了姻几?” 一聲冷哼從身側(cè)響起宜狐,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤势告,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抚恒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咱台,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年俭驮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了回溺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡表鳍,死狀恐怖馅而,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情譬圣,我是刑警寧澤瓮恭,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站厘熟,受9級(jí)特大地震影響屯蹦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绳姨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一登澜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧飘庄,春花似錦脑蠕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至碾盐,卻和暖如春晃跺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毫玖。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工掀虎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人付枫。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓烹玉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阐滩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子春霍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容