You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java AWT调用getSubimage时出现(y+height)超出Raster错误求助

问题:分割1024x64图片时抛出RasterFormatException异常

我编写了一个方法,用于加载一张1024x64的图片并将其分割为8等份,代码如下:

@Override
public void loadAnimations() {
   idleAnimation = new LinkedList<>();
   BufferedImage image = Loader.getSprite(PLAYER);

   int idleAnimationLength = 8;
   for (int i = 0; i < idleAnimationLength; i++) {
      System.out.println(image);
      idleAnimation.add(image.getSubimage(i * 128, 64, 128, 64));
   }
}

对应的图片:
1024x64的精灵图

当设置的高度(应为64)大于32时,会抛出如下异常:

BufferedImage@e6ea0c6: type = 6 ColorModel: #pixelBits = 32 numComponents = 4 color space = java.awt.color.ICC_ColorSpace@6a38e57f transparency = 3 has alpha = true isAlphaPre = false ByteInterleavedRaster: width = 1024 height = 64 #numDataElements 4 dataOff[0] = 3
Exception in thread "main" java.awt.image.RasterFormatException: (y + height) is outside of Raster
    at java.desktop/sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleavedRaster.java:1244)
    at java.desktop/java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1203)
    at org.victorpiles.engine.entity.player.Player.loadAnimations(Player.java:40)
    at org.victorpiles.engine.entity.player.Player.<init>(Player.java:19)
    at org.victorpiles.engine.Game.<init>(Game.java:13)
    at org.victorpiles.Main.main(Main.java:30)

Process finished with exit code 1

通过System.out.println(image)可以看到图片的宽度为1024,高度为64,请问我哪里操作出错了?


问题原因及解决方法

问题出在getSubimage(int x, int y, int w, int h)方法的参数上:你传入的y坐标是64,但图像的坐标系统是从0开始计数的,这张图片的高度是64,所以y的合法取值范围是0到63(包含)。当你设置y=64,再加上高度64时,64+64=128,远远超出了图片的实际高度64,直接触发了RasterFormatException异常。

你需要把y坐标改成0,因为要截取的是图片的完整高度区域,从顶部(y=0)开始,高度64。修改后的代码如下:

@Override
public void loadAnimations() {
   idleAnimation = new LinkedList<>();
   BufferedImage image = Loader.getSprite(PLAYER);

   int idleAnimationLength = 8;
   for (int i = 0; i < idleAnimationLength; i++) {
      System.out.println(image);
      // 将第二个参数从64改为0
      idleAnimation.add(image.getSubimage(i * 128, 0, 128, 64));
   }
}

这样就能正确截取到每张128x64的子图了。


内容的提问来源于stack exchange,提问作者VictoRPiles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:13:41