光栅之外的Java getSubimage()

我正在尝试拍摄图像并将其存储在16x16子图像数组中。我使用的图像是512x512像素。但是,在遍历循环时,getSubimage()被Raster异常停止。

这是代码:

public class TileList extends JPanel {

private static final int width = 16; //width of a tile

private static final int height = width;

private int col = 1;

private int row = 1;

private BufferedImage image;

File tilesetImage = new File("image.png");

BufferedImage tileset[];

public void loadAndSplitImage (File loadImage) {

try{

image = ImageIO.read(loadImage);

}catch(Exception error) {

System.out.println("Error: cannot read tileset image.");

}// end try/catch

col = image.getWidth()/width;

row = image.getHeight()/height;

tileset = new BufferedImage[col*row];

}// end loadAndSplitImage

public TileList() {

loadAndSplitImage(tilesetImage);

setLayout(new GridLayout(row,col,1,1));

setBackground(Color.black);

int x=0;

int y=0;

int q=0; //keeps track of tile #

for (int i = 0; i < row; i++) {

for (int j = 0; j < col; j++) {

JPanel panel = new JPanel();

tileset[q] = new BufferedImage(width, height, image.getType());

tileset[q] = image.getSubimage(x,y,x + width,y + height);

panel.add(new JLabel(new ImageIcon(tileset[q])));

add(panel);

x += width;

q++;

}// end for loop

y += height;

x = 0;

}// end for loop

}// end constructor

}// end class

这是错误:

Exception in thread "AWT-EventQueue-0" java.awt.image.RasterFormatException: (x

+ width) is outside of Raster

at sun.awt.image.ByteInterleavedRaster.createWritableChild(ByteInterleav

edRaster.java:1245)

at java.awt.image.BufferedImage.getSubimage(BufferedImage.java:1173)

at TileList.<init>(TileList.java:59)

at TileList.createAndShowGui(TileList.java:79)

at TileList$1.run(TileList.java:88)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)

at java.awt.EventQueue.access$200(EventQueue.java:103)

at java.awt.EventQueue$3.run(EventQueue.java:682)

at java.awt.EventQueue$3.run(EventQueue.java:680)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo

main.java:76)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre

ad.java:244)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.

java:163)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre

ad.java:151)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

回答:

您将错误的参数传递给getSubimage。文档说…

参数:

x-指定矩形区域的

左上角的X坐标y- 指定矩形区域的左上角的Y坐标

w- 指定矩形区域的宽度

h-指定高度矩形区域

您正在传递x, y, x + width, y + width,这意味着如果x= 256,则width实际上等于256 + 16 =

272

因此您的新图像将是… x + width = 256 + 272 = 528,它比您的图像区域宽。

你应该过去 x, y, width, heigh

tileset[q] = image.getSubimage(x, y, width, height);

以上是 光栅之外的Java getSubimage() 的全部内容, 来源链接: utcz.com/qa/423363.html

回到顶部