2014-03-04 104 views
2
width = 25; 
    height = 25; 

    h1Walking = new BufferedImage[6]; 
     BufferedImage sprite1 = ImageIO.read(new File(getClass().getResource("/Resources/kirbywalk.gif").toURI())); 
     for(int i = 0; i < h1Walking.length; i++){ 
      h1Walking[i] = sprite1.getSubimage(
        i * width + i, 
     0, 
     width, 
     height 
       ); 
     } 

上面放置的代碼是在我的程序中返回錯誤的部分。我不明白爲什麼它這樣做有沒有人有任何想法,爲什麼它返回下面的錯誤?柵格格式異常(Y +高度)

java.awt.image.RasterFormatException: (y + height) is outside of Raster 
    at sun.awt.image.BytePackedRaster.createWritableChild(BytePackedRaster.java:1312) 
    at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1196) 
    at Main.Horses.<init>(Horses.java:72) 
    at Main.HorseRacingGame.run(HorseRacingGame.java:113) 
    at java.lang.Thread.run(Thread.java:695) 

回答

1

RasterFormatExceptiongetSubimage呼叫來這裏:

h1Walking[i] = sprite1.getSubimage(
    i * width + i, 
    0, 
    width, 
    height 
); 

getSubimage方法採用xywidthheight爲其中x和y是左上像素的座標參數的子圖像(來自javadoc)。

一個RasterFormatException如果你的參數引用的子圖像不被圖像界被拋出。所以,你參數中的某些東西超出了圖像的範圍。

對於你的X,你正在使用i * width + i,但我相信你的意思i * width。這將確保圖片的每個垂直條從最後一個結束處開始。

此外,問題可能是使用恆定的寬度和高度給你一個錯誤。相反,你可以考慮做sprite1.getWidth()/h1walking.length以及類似的高度。

+0

嗨盧克,很好發現。並感謝您指出我自己的答案白癡......乾杯:-) –

0

也許你會在「/Resources/kirbywalk.gif」

的像素邊界如果你知道子圖像的數量和它們橫放,也許實現這樣的事情:

// load the image 
BufferedImage sprite1 = ImageIO.read(new File(getClass().getResource("/Resources/kirbywalk.gif").toURI())); 
// declare ammount of cells in image 
int num_of_cells = 6; 
h1Walking = new BufferedImage[num_of_cells]; 
// find cell height and width based on the original image 
int width = sprite1.getWidth()/ num_of_cells; 
int height = sprite1.getHeight() 

for(int i = 0; i < num_of_cells; i++) 
    h1Walking[i] = sprite1.getSubimage(i *width,0,width,height); 

通過輪詢圖像的高度和寬度,你可以放心,所有的點將保持在gif限制內。