栅格格式异常(Y +高度)

时间:2014-03-04 19:57:36

标签: java exception raster

    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)

2 个答案:

答案 0 :(得分:2)

RasterFormatException来自getSubimage来电:

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和类似的高度。

答案 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限制范围内。