bitmap是每個(gè)Android都會(huì)接觸到的,雖然大部分情況下我們都會(huì)用圖片框架來(lái)加載圖片如glide,fresco等。當(dāng)然推薦都使用對(duì)應(yīng)框架來(lái)加載,官方也推薦使用glide來(lái)加載。
偶爾有時(shí)候我們也會(huì)直接從資源里加載,沒(méi)用框架去加載它常用是從BitmapFactory類的三方方式來(lái)獲取bitmap。
一. 采用適當(dāng)壓縮降低內(nèi)存使用
- decodeByteArray(),從byte數(shù)組中解析出bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(imgByte, 0, imgByte.length);
- decodeFile(),從指定文件路徑解析出bitmap
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
- decodeResource(), 從資源文件中解析出bitmap
Bitmap bitmap = BitmapFactory.decodeResource(res, resId);
初此之外,我們還可以在方法最后加一個(gè)BitmapFactory.Options參數(shù),該參數(shù)會(huì)用于指定操作,比如縮放啊,抖動(dòng)啊,寬高。
在我們沒(méi)有指定option的時(shí)候,默認(rèn)是沒(méi)有這些處理的,會(huì)直接加載,在內(nèi)存比較小的機(jī)器上,就可能出現(xiàn)OOM了,而且也造成了內(nèi)存浪費(fèi),一個(gè)大分辨率的圖片,沒(méi)必要在一個(gè)小控件上完全展示,看起來(lái)也并沒(méi)有特別的優(yōu)點(diǎn)。所以咱們可以根據(jù)展示控件寬高來(lái)選擇解析出的圖片大小縮放,達(dá)到適度的降低內(nèi)存使用。
- 處理方式:
/**
* 從資源文件中獲取壓縮后的bitmap,根據(jù)寬高方式壓縮
*
* @param res 資源
* @param resId 資源id
* @param reqWidth 需要的寬度
* @param reqHeight 需要的高度
* @return 壓縮后的bitmap
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
Log.i(TAG, "inSampleSize:" + options.inSampleSize);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
/**
* 計(jì)算壓縮大小
*
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
private static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
參考自官方文檔:
有效裝載大圖
二. 采用重用降低內(nèi)存分配
通過(guò)設(shè)置inBitmap參數(shù),達(dá)到可以重用效果。記錄下,不多講,官方貌似也不推薦使用,地址