2014-01-23 59 views
0

所以對於wanky標題。沒有想出一個簡短的懷孕描述。getScaledInstance後的高度和寬度-1 java Image

我的問題是這行代碼:

ii = new ImageIcon("images/player.png"); 
image = ii.getImage(); 
image = image.getScaledInstance(SCALED_X, SCLAED_Y, Image.SCALE_SMOOTH); 
positionX = windowWidth/2 - image.getWidth()/2; 
positionY = windowHeight - image.getHeight(); 

當我調試,我注意到,圖像的高度和寬度-1,調用getScaledInstance功能後的代碼,因此,最後兩行返回錯誤的結果。我想出了一個解決方法是使用SCALED_X和SCALED_Y作爲新的高度和寬度,但那不是那麼漂亮.- 任何人都可以解釋爲什麼這是,即高度和寬度的值爲-1?使用getScaledInstance函數時是否會丟失這些屬性(在文檔中找不到任何關於這些內容的文字)?有什麼方法可以將它們添加到Image中嗎?

有沒有辦法縮小圖像的大小,並保持resp。自動調整屬性?

編輯:

更改代碼來獲取圖像到:

try { 
    image = ImageIO.read(new File("images/player.png")).getScaledInstance(SCALED_X, SCLAED_Y, Image.SCALE_SMOOTH);   
} catch (IOException e) { 
    e.printStackTrace(); 
} 

誤差-1仍然存在:(

+1

使用ImageIO加載圖像。 ImageIcon是一個Swing組件,即GUI的一部分。如果您沒有使用Swing創建GUI,請不要使用它。 – Njol

+0

那就是。不知道。 關於實際問題的任何想法? – datosh

+0

ImageIcon在內部使用的圖像可能不支持調整大小,因此會從該方法返回無效的圖像。 – Njol

回答

0

閱讀所使用的方法的Javadoc表明,圖像沒有在調用getHeight/getWidth時已縮放:

getScaledInstance():

創建此圖像的縮放版本。將返回一個新的Image對象,默認情況下該對象將呈現指定寬度和高度的圖像。即使原始源圖像已經完全加載,新的圖像對象也可以異步加載

的getHeight():

確定圖像的高度。 如果高度還不知道,此方法返回-1

您有幾種選擇:您可以等待圖像進行縮放,或者使用ImageObserver的計算所需的值時,所述寬度和高度變得可用,或者使用SCALED_X/Y常量代替image.getWidth/Height,或者通過創建新的BufferedImage並將舊圖像繪製到新圖像上來自行縮放圖像。

另一種可能性是簡單地假定玩家圖像的大小正確 - 這會讓您的遊戲加載速度更快,並且玩家將完全按照藝術家繪製的方式出現在遊戲中。

+0

感謝您的答案。真的不知道在這種情況下「異步加載」的含義。我只是使用我的SCALED_X/Y,當遊戲運行時,這些值應該始終可用...我猜;) – datosh