2010-04-29 85 views
9

如果我有一個我知道高度和寬度的圖像,如何將它放在具有最大可能尺寸的矩形中而不會拉伸圖像。使圖像適合長方形

僞代碼已經足夠了(但我打算在Java中使用它)。

謝謝。


所以,根據答案,我寫了這個:但它不起作用。我做錯了什麼?

double imageRatio = bi.getHeight()/bi.getWidth(); 
double rectRatio = getHeight()/getWidth(); 
if (imageRatio < rectRatio) 
{ 
    // based on the widths 
    double scale = getWidth()/bi.getWidth(); 
    g.drawImage(bi, 0, 0, (int) (bi.getWidth() * scale), (int) (bi.getHeight() * scale), this); 
} 
if (rectRatio < imageRatio) 
{ 
    // based on the height 
    double scale = getHeight()/bi.getHeight(); 
    g.drawImage(bi, 0, 0 , (int) (bi.getWidth() * scale), (int) (bi.getHeight() * scale), this); 
} 
+0

你的意思是保持擬合方面寬高比? – 2010-04-29 19:11:30

+0

@SB:我認爲是這樣(我不明白你的意思是什麼......)所以,源圖像和縮放圖像的寬度和高度的比例必須相同。 – 2010-04-29 19:13:20

回答

15

確定兩者的縱橫比(高度除以寬度,比方說,這麼高,瘦矩形的縱橫比> 1)。

如果矩形的長寬比大於圖像的寬高比,則根據寬度(矩形寬度/圖像寬度)均勻縮放圖像。

如果矩形的縱橫比小於圖像的縱橫比,則根據高度(矩形高度/圖像高度)均勻縮放圖像。

+0

你能看看我的更新嗎? – 2010-04-29 19:41:15

+0

據我所知,它看起來像你正在做我的建議,我想我再次檢查我的邏輯。這些值是否正確,你在每一步都抓住了? (是bi.GetWidth()和GetHeight()都給你正確的數字?)(我不是一個Java程序員,但我昨晚留在了快捷假日酒店!)) – John 2010-04-29 19:49:51

+0

我發現它:不使用雙打 – 2010-04-29 20:15:43

7

這裏是我的兩分錢:

/** 
* Calculate the bounds of an image to fit inside a view after scaling and keeping the aspect ratio. 
* @param vw container view width 
* @param vh container view height 
* @param iw image width 
* @param ih image height 
* @param neverScaleUp if <code>true</code> then it will scale images down but never up when fiting 
* @param out Rect that is provided to receive the result. If <code>null</code> then a new rect will be created 
* @return Same rect object that was provided to the method or a new one if <code>out</code> was <code>null</code> 
*/ 
private static Rect calcCenter (int vw, int vh, int iw, int ih, boolean neverScaleUp, Rect out) { 

    double scale = Math.min((double)vw/(double)iw, (double)vh/(double)ih); 

    int h = (int)(!neverScaleUp || scale<1.0 ? scale * ih : ih); 
    int w = (int)(!neverScaleUp || scale<1.0 ? scale * iw : iw); 
    int x = ((vw - w)>>1); 
    int y = ((vh - h)>>1); 

    if (out == null) 
     out = new Rect(x, y, x + w, y + h); 
    else 
     out.set(x, y, x + w, y + h); 

    return out; 
} 
+0

感謝這個Mobistry。 – Robinson 2013-02-17 18:36:38