我有一张5x5的精灵表,每个精灵都是20x20像素。我需要将该精灵表中的每个项目都放入一个数组中。我做了一个for
循环但是出错了。所以我尝试自己定义数组中的一个子图像但仍然出错。当我不打印该数组的项目时,我没有收到错误。我现在无法弄清楚for循环问题。
到目前为止,这是我的代码
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class LoopSub extends Component {
BufferedImage img;
BufferedImage img2;
BufferedImage bigImg;
BufferedImage[] sprites;
public void paint(Graphics g) {
g.drawImage(img, 0, 0, null);
g.drawImage(img2, 18, 0, null); //letter size 20x20 ; set lower to overlap
g.drawImage(sprites[0], 36, 0, null); //this is whats causing the error
}
public LoopSub() {
try {
img = ImageIO.read(new File("res/a.png"));
img2 = ImageIO.read(new File("res/b.png"));
/////////////////////////////
bigImg = ImageIO.read(new File("sheet.png"));
final int width = 20;
final int height = 20;
final int rows = 5;
final int cols = 5;
sprites = new BufferedImage[rows * cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
sprites[(i * cols) + j] = bigImg.getSubimage(
j * width,
i * height,
width,
height
);
}
}
sprites[0] = bigImg.getSubimage(1,1,1,1); //where I tried to define the array myself
/////////////////////////////////////////////
} catch (IOException e) {
}
}
public Dimension getPreferredSize() { //sets size of screen
if (img == null) {
return new Dimension(100,100);
} else {
return new Dimension(img.getWidth(null), img.getHeight(null)); //sets size to one image //// change to all images
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Load Image Sample");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.add(new LoopSub());
f.pack();
f.setVisible(true);
}
}
新错误消息
Exception in thread "main" java.awt.image.RasterFormatException: (x + width) is outside of Raster
at sun.awt.image.ByteInterleavedRaster.createWritableChild(Unknown Source)
at java.awt.image.BufferedImage.getSubimage(Unknown Source)
at LoopSub.<init>(LoopSub.java:48)
at LoopSub.main(LoopSub.java:85)
将j*width
更改为1时,工作正常。这就是问题所在。只是不知道为什么。
答案 0 :(得分:1)
您有NullPointerException
,这意味着sprites
或sprites[0]
为null
。
鉴于你在构造函数中初始化它们,只有在构造函数中出现IOException
时才会发生它,因为你正在捕获它,所以它不会终止程序。
你应该:
从不默默地忽略异常,就像你在这里做的那样。如果你没有做任何有用的事情,至少要写一条消息来打印这样的错误:
} catch (IOException e) {
e.printStackTrace();
}
查看异常的内容,其中包含问题的根源。可能程序由于某种原因无法找到您的某个文件。
修改:对于RasterFormatException
,这意味着您已超出图像的限制。更具体地说,j * width + width
显然大于图像的宽度。
由于j最多为4而width
为20,因此j * width + width
可以具有的最大值为100.原始图像应至少为100px宽(也是100px高)。检查确实是这种情况。
例如,您可以在循环之前以这种方式打印宽度:
System.out.println("bigImg width: " + bigImg.getWidth());