2015-04-29 57 views
1

我在開發人員的網站上找到了有關加載大型位圖高效教程的文章。兩次解碼bitmapfactory有什麼用?

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); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

我的問題是什麼是解碼資源的第一次,你可以設置inSampleSize然後解碼它。

回答

2

這是下載圖像時的常用策略。

由於您幾乎從不想要下載分辨率高於可顯示分辨率的圖像,而且由於Android在內存管理方面相當困難,因此該系統允許您首先評估圖像的大小,而當你真正下載時,你可以控制你想要的多少下取樣。

簡單地說,下采樣意味着您將跳過多少像素。例如,1的下采樣不會減少。然而,下采樣2會在水平和垂直方向上跳過所有其他像素,從而產生一半寬度和一半高度的位圖以及四分之一內存。

如果你看一下這個代碼:

final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    **BitmapFactory.decodeResource(res, resId, options);** 

這裏發生的事情是叫「decodeResource」,你傳遞一個Options物體inJustDecodeBounds = true時。這是告訴BitmapFactory實際上並沒有加載圖像像素,而只是對圖像的邊界進行解碼 - 這是一個便宜得多的操作。當您這樣做時,BitmapFactory的結果爲null,但參數OptionsoutWidth, outHeight)將具有描述圖像寬度/高度的有效值。有了這個,你可以計算出你想要的樣本大小,並最終下載實際的圖像,但是它的大小對於你的應用來說是最優的。