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)); } }
对应的图片:
当设置的高度(应为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
相关产品推荐
相关产品推荐

