在第一次採樣的基礎上,我來進行二次採樣。二次採樣的時候,我把第一次採樣後算出來的結果作爲一個參數傳遞給第BitmapFactory,這樣在加載圖片的時候系統就不會將整張圖片加載進來了,而是隻會加載該圖片的一張縮略圖進來,這樣不僅提高了加載速率,而且也極大的節省了內存,而且對於用戶來說,他也不會有視覺上的差異。
import android.graphics.BitmapFactory;
public class BitmapUtils {
/**
* @param filePath 要加載的圖片路徑
* @param destWidth 顯示圖片的控件寬度
* @param destHeight 顯示圖片的控件的高度
* @return
*/
public static android.graphics.Bitmap getBitmap(String filePath, int destWidth, int destHeight) {
//第一次採樣
BitmapFactory.Options options = new BitmapFactory.Options();
//該屬性設置爲true只會加載圖片的邊框進來,並不會加載圖片具體的像素點
options.inJustDecodeBounds = true;
//第一次加載圖片,這時只會加載圖片的邊框進來,並不會加載圖片中的像素點
BitmapFactory.decodeFile(filePath, options);
//獲得原圖的寬和高
int outWidth = options.outWidth;
int outHeight = options.outHeight;
//定義縮放比例
int sampleSize = 1;
while (outHeight / sampleSize > destHeight || outWidth / sampleSize > destWidth) {
//如果寬高的任意一方的縮放比例沒有達到要求,都繼續增大縮放比例
//sampleSize應該爲2的n次冪,如果給sampleSize設置的數字不是2的n次冪,那麼系統會就近取值
sampleSize *= 2;
}
/********************************************************************************************/
//至此,第一次採樣已經結束,我們已經成功的計算出了sampleSize的大小
/********************************************************************************************/
//二次採樣開始
//二次採樣時我需要將圖片加載出來顯示,不能只加載圖片的框架,因此inJustDecodeBounds屬性要設置爲false
options.inJustDecodeBounds = false;
//設置縮放比例
options.inSampleSize = sampleSize;
//加載圖片並返回
return BitmapFactory.decodeFile(filePath, options);
}
public static android.graphics.Bitmap getBitmap(byte[] filePath, int destWidth, int destHeight) {
//第一次採樣
BitmapFactory.Options options = new BitmapFactory.Options();
//該屬性設置爲true只會加載圖片的邊框進來,並不會加載圖片具體的像素點
options.inJustDecodeBounds = true;
//第一次加載圖片,這時只會加載圖片的邊框進來,並不會加載圖片中的像素點
BitmapFactory.decodeByteArray(filePath, 0, filePath.length, options);
//獲得原圖的寬和高
int outWidth = options.outWidth;
int outHeight = options.outHeight;
//定義縮放比例
int sampleSize = 1;
while (outHeight / sampleSize > destHeight || outWidth / sampleSize > destWidth) {
//如果寬高的任意一方的縮放比例沒有達到要求,都繼續增大縮放比例
//sampleSize應該爲2的n次冪,如果給sampleSize設置的數字不是2的n次冪,那麼系統會就近取值
sampleSize *= 2;
}
/********************************************************************************************/
//至此,第一次採樣已經結束,我們已經成功的計算出了sampleSize的大小
/********************************************************************************************/
//二次採樣開始
//二次採樣時我需要將圖片加載出來顯示,不能只加載圖片的框架,因此inJustDecodeBounds屬性要設置爲false
options.inJustDecodeBounds = false;
//設置縮放比例
options.inSampleSize = sampleSize;
//加載圖片並返回
return BitmapFactory.decodeByteArray(filePath, 0, filePath.length, options);
}
}