2014-04-13 43 views
3

我有一個120x120px的圖像位於我的/res/drawable/目錄中。這是所有設備所需的尺寸。爲什麼BitmapFactory.decodeResource會縮放我的圖像?

要裝入此位圖,我使用了以下內容:

Bitmap tmpBmp = BitmapFactory.decodeResource(getResources(), R.drawable.myimage); 

的問題是,當我衡量tmpBmp,大小爲360x360px。我知道如何將這個縮​​小到我需要的120x120,但這是浪費處理時間,儘管很小。

我認爲這與屏幕密度有關,因爲我的資源位於無密度目錄中。

decodeResource縮放我的圖像的原因是什麼?我如何阻止它這樣做?

回答

13

默認的drawable目錄假定圖像需要從默認的mdpi大小縮放。如果要禁用資源縮放,請將圖像放入drawable-nodpi

請注意,與mdpi設備相比,xxhdpi設備上的120x120px圖像(如果顯示在屏幕上)會減小3倍(因爲每英寸的像素數爲三倍)。

+0

我只是使用臨時圖形,直到我遇到一個平面設計師,所以我只有幾個靜態大小的圖像爲我的設備。我認爲無密度不縮放,我不知道'-nodpi'指令。 –

+0

對,'drawable'目錄假設您希望圖像在所有設備上具有相同的物理尺寸(即自動縮放),因爲這幾乎總是正確的事情(很少需要圖形的物理尺寸取決於顯示器的密度),爲什麼這是默認值,爲什麼'-nodpi'存在於特殊情況下。 – ianhanniballake

+0

太棒了。感謝幫助。 –

1

這是因爲屏幕和圖像的密度不同。那麼如果你沒有指定Options系統會爲你做。在BitmapFactory源,你可以看到這一點:

public static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, Options opts) { 

    if (opts == null) { 
     opts = new Options(); 
    } 

    if (opts.inDensity == 0 && value != null) { 
     final int density = value.density; 
     if (density == TypedValue.DENSITY_DEFAULT) { 
      opts.inDensity = DisplayMetrics.DENSITY_DEFAULT; 
     } else if (density != TypedValue.DENSITY_NONE) { 
      opts.inDensity = density; 
     } 
    } 

    if (opts.inTargetDensity == 0 && res != null) { 
     opts.inTargetDensity = res.getDisplayMetrics().densityDpi; 
    } 

    return decodeStream(is, pad, opts); 
} 

因此防止結垢,你需要與inScaled=false PARAM指定Options PARAM。或將您的圖像放到res/drawable-nodpi文件夾中。

相關問題