bitmap的處理,盡量避免OOM

2021-06-23 06:47:13 字數 1495 閱讀 3272

bitmap是乙個吃記憶體的大傢伙,如果使用不當,那麼程式就會oom常伴了。因此,這篇文章主要介紹幾個方法來控制好bitmap對記憶體的占用。

第一種方法:按比例縮小bitmap

private bitmap getbitmap(string srcpath)  else if (w < h && h > hh)  if (scale <= 0) scale = 1; newopts.insamplesize = scale; // 設定縮放比例 // 重新讀入,注意此時已經把options.injustdecodebounds 設回false了 

bitmap = bitmapfactory.decodefile(srcpath, newopts); return bitmap;

}

簡要的說明一下;第一次設定newopts.injustdecodebounds = true時,是為了解析這個bitmap的寬高,但是並不生成bitmap物件,所以 

bitmap bitmap = bitmapfactory.decodefile(srcpath,newopts);

並不會返回乙個bitmap,即返回的是null。此時可以再newopts中取得這個bitmap的寬高。接下來,我們就可以用來計算要縮小的比例尺了。

注意:scale計算出來的值大於1的話,假設為n(n>1,n為int型),則表示要bitmap要縮小為原來的1/n。計算得到比例尺之後,設定到

newopts.insamplesize = scale;  // 設定縮放比例

此時還要不忘設定

newopts.injustdecodebounds = false;
接著重新解析bitmap,即可獲得縮小後的bitmap

第二種方法:按指定大小來縮小bitmap

// 按實際的大小生成的bitmap

bitmap bm = bitmapfactory.decoderesource(mcontext.getresources(), mimageids[arg0]);

bm = bitmap.createscaledbitmap(bm, width, height, false);

在bitmap中,有乙個方法可以來縮放bitmap,使用起來十分簡便。在createscaledbitmap中傳入自己指定的寬高,即可讓bitmap按比例縮小。減低其對記憶體的占用。

經過我的測試,以上兩種方法都能夠有效的縮小bitmap對記憶體的占用,當一張很大的解析成bitmap時,可能會達到1m以上,此時,將會很容易造成oom。

但是經過上面兩種方法的壓縮之後,bitmap能夠按照需要的寬高來縮小,從而有效的降低記憶體的占用。解釋一下為什麼能減低記憶體的占用:假設乙個bitmap的寬高分別縮小到原來的1/4,那麼它所占用的大小為寬乘以高,即為原來的1/4 * 1/4 = 1/16。所以能夠有效降低記憶體占用。

處理Bitmap出現oom的異常

大小 直接使用imageview顯示bitmap會占用較多資源,特別是較大的時候,可能導致崩潰。使用bitmapfactory.options設定insamplesize,這樣做可以減少對系統資源的要求。屬性值insamplesize表示縮圖大小為原始大小的幾分之一,即如果這個值為2,則取出的縮圖的...

安卓中Bitmap的處理

呼叫安卓手機系統照相機進行拍照 系統照相機得到的相片解析度太大,如果不處理直接使用就會導致outofmemery異常,我採用的是下面這段 計算的縮放值 public static int calculateinsamplesize bitmapfactory.options options,int ...

盡量避免在SQL語句的WHERE子句中使用函式

start 在sql語句的where子句中應該盡量避免在字段上使用函式,因為這樣做會使該字段上的索引失效,影響sql語句的效能。即使該字段上沒有索引,也應該避免在字段上使用函式。考慮下面的情況 現在要求你把2009.9.24註冊的使用者都查出來,怎麼辦?可能有人會這麼寫 不過很遺憾,這個語句是錯誤的...