圖片的二次採樣

      在第一次採樣的基礎上,我來進行二次採樣。二次採樣的時候,我把第一次採樣後算出來的結果作爲一個參數傳遞給第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);
    }
}


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