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
);
}
我上面的代码是在我的程序中返回错误的部分。我不明白为什么这样做有没有人知道为什么它会返回下面的错误?
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)
答案 0 :(得分:2)
RasterFormatException
来自getSubimage
来电:
h1Walking[i] = sprite1.getSubimage(
i * width + i,
0,
width,
height
);
getSubimage
方法将x
,y
,width
和height
作为参数,其中x和y是左上角像素的坐标子图像(来自javadoc)。
如果参数引用的子图像不受图像限制,则抛出RasterFormatException
。因此,参数中的某些内容超出了图像范围。
对于您的x,您使用的是i * width + i
,但我相信您的意思是i * width
。这将确保图片的每个垂直条带从最后一个结束处开始。
此外,问题可能是使用恒定的宽度和高度会给您一个错误。相反,你可以考虑做sprite1.getWidth() / h1walking.length
和类似的高度。
答案 1 :(得分:1)
也许你正在越过“/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限制范围内。