安卓中的圖片壓縮加載的原理

在安卓開發中經常會加載各類圖片,圖標等,但是關注內存消耗的小夥伴們會發現:本來不大的一張圖片加載後會使app佔用的內存增大幾Mb甚至十幾Mb的內存,這是怎麼回事呢.下面我將會對此通過一個測試來給出答案:

1.普通加載圖片的方法是

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fast,opts);

通過一段代碼的測試,就能發現這種加載模式的弊端:

StringBuilder sb = new StringBuilder();
sb.append("加載圖片前的內存佔用:"+Formatter.formatFileSize(this, Runtime.getRuntime().totalMemory()));
mDesc.setText(sb.toString());
//
普通加載圖片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fast);
mImg.setImageBitmap(bitmap);
sb.append("\r\n");
sb.append("加載圖片後的內存佔用:"+Formatter.formatFileSize(this, Runtime.getRuntime().totalMemory()));
mDesc.setText(sb.toString());

普通加載模式

普通加載後,app內存佔用多了8.8Mb;

2.手動設置採樣比的壓縮加載方式

StringBuilder sb = new StringBuilder();
sb.append("加載圖片前的內存佔用:"+Formatter.formatFileSize(this, Runtime.getRuntime().totalMemory()));
//獲取加載圖片前的app中佔內存的大小
mDesc.setText(sb.toString());
Options opts = new Options();
//設置採樣比
opts.inSampleSize = 2;
//帶壓縮比例的加載圖片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fast,opts);
mImg.setImageBitmap(bitmap);
sb.append("\r\n");
sb.append("加載圖片後的內存佔用:"+Formatter.formatFileSize(this, Runtime.getRuntime().totalMemory()));
mDesc.setText(sb.toString());


加載後,app內存佔用多了2.2Mb;

3.按科學壓縮比加載圖片

StringBuilder sb = new StringBuilder();
sb.append("加載圖片前的內存佔用:"+Formatter.formatFileSize(this, Runtime.getRuntime().totalMemory()));
//獲取加載圖片前的app中佔內存的大小
mDesc.setText(sb.toString());
Options opts = new Options();
//設置只加載圖片的邊界參數  寬高尺寸
opts.inJustDecodeBounds = true;
//帶壓縮比例的加載圖片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fast,opts);
//設置科學的採樣比(獲取圖片的寬度和高度)
opts.inSampleSize = caculateSampleSize(opts.outWidth,opts.outHeight);
//關閉標記  解析真實的圖片
opts.inJustDecodeBounds = false;
//按科學的採樣比加載圖片
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fast,opts);
mImg.setImageBitmap(bitmap);
sb.append("\r\n");
sb.append("加載圖片後的內存佔用:"+Formatter.formatFileSize(this, Runtime.getRuntime().totalMemory()));
mDesc.setText(sb.toString());


加載後,app內存佔用多了0.04Mb;.

此處如果設置渲染模式爲:opts.inPreferredConfig = Config.RGB_565;時,內存佔用會更小.但是Config.RGB_565模式的渲染會丟失圖片的透明色彩,所以建議在加載小圖標時可用此種渲染模式,其他時候的圖片加載展示還是用默認的Config.ARGB_8888模式.


4.下面給出計算並獲取合理的採樣比的方法的代碼:

private int caculateSampleSize(int outWidth, int outHeight) {
//設置初始的採樣比爲1  即原始比例
int  inSampleSize = 1;
//判斷 當圖片的寬度>高度時,就參照寬度採樣;否則相反
if (outWidth>outHeight) {
inSampleSize = outWidth/mImg.getWidth();
} else {
inSampleSize = outHeight/mImg.getHeight();
}
//判斷當採樣比小於1時,按1計算    即圖片寬高小於控件的寬高時,圖片按原尺寸加載
if (inSampleSize<1) {
inSampleSize = 1;
}
return inSampleSize;

}

內容可能與標題與出入,原理僅供參考...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章