我知道当它无法获得图像的宽度或高度时,该方法返回-1,但我希望你能告诉我为什么它无法做到这一点。在这里,我创建了一些ImageIcons并将它们保存在图像数组中:
for(int x = 0; x < playerSprites.length; x++){
playerSprites [x] = new ImageIcon("player" + x + ".png").getImage()
}
稍后我创建了一个类的实例,该实例目前只创建此数组。当我想要从另一个类中获取Array中的图像时,我会检查它们的高度和宽度,并且我总是得到-1:
public Image nextImage(String name){
Image image = null;
if(name.equals("player")){
if(counter == animationImageManager.getPlayerSprites().length-1){
counter = 0;
}
image = animationImageManager.getPlayerSprites()[counter];
counter++;
}
return image;
}
答案 0 :(得分:2)
如果找不到图像,则高度和宽度仍然会返回-1。
尝试以下示例代码重现问题:
System.out.println(new ImageIcon("").getImage().getWidth(null)); // print -1
值得在Loading Images Using getResource上阅读 Java Tutorial
可能没有正确加载图像。
您可以根据图片位置尝试任何一种。
// Read from same package
ImageIO.read(getClass().getResourceAsStream("c.png"));
// Read from images folder parallel to src in your project
ImageIO.read(new File("images/c.jpg"));
// Read from src/images folder
ImageIO.read(getClass().getResource("/images/c.png"))
// Read from src/images folder
ImageIO.read(getClass().getResourceAsStream("/images/c.png"))
答案 1 :(得分:1)
如果图像为空,则Image的宽度/高度将返回-1。什么时候没有图像。
建议:
使用ImageIO.read()
,如果IO出现问题,将抛出IOException
,如路径错误。
如果图片是您的应用程序的资源,则不要将其作为文件读取,请通过URL将其作为资源读取。例如,如果图片在src/images
中,那么您可以
URL url = getClass().getResource("/images/myimage/png");
BufferedImage image = ImageIO.read(url);
使用ImageIcon
时要注意的重要事项是,当您将String传递给构造函数时,它将在本地文件系统中查找该文件。它可能在您开发时有效,但是一旦您使用jar中的图像部署应用程序,它就不再使用文件路径,因为它将不再有效。您可以将URL传递给ImageIcon,就像上面一样,但就像我说的那样,ImageIO允许更多的错误检测。
只是让您了解当前代码中的内容,通过仅指定图像文件名作为ImageIcon的路径,搜索将在项目的根目录中查找图像文件夹(如果您在IDE中工作),因为它是工作目录。因此,如果您的图像不存在,则无法找到图像。
关于我的第二个要点的另一个注意事项是如何搜索图像。您可以看到我使用的路径"/images/myimage/png"
。前面的/
是什么,将搜索带到类路径的根,在开发视图中,它是src
。调用类通常位于类路径的某个包中,比如com.hello.somepackage.SomeClass
。因此,如果SomeClass
尝试在没有/
的情况下调用getclass getresource,则搜索将从类的位置开始,该类位于包中。
使用资源/图像时需要考虑的一些事项。但是前几点应该让你前进。