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註冊的使用者都查出來,怎麼辦?可能有人會這麼寫 不過很遺憾,這個語句是錯誤的...