从 Jar 中的资源文件夹中引用图片
Referencing Pictures from resource folder in a Jar
我无能为力,但我想我只是错过了回答我问题的线程,但我已经找了很长时间了,似乎找不到我需要的帮助。
我的问题很简单:
我已经创建了一个游戏(或者更确切地说我正在制作它)并且我正在尝试向其中添加精灵(敌人等的 png 文件)。将它们加载到 IDE 中工作正常,但是当我创建一个 jar 文件并尝试打开它时,它只是显示 "A Java Exception has occurred"。进一步调查发现问题是它找不到我告诉它加载的文件。
通过我阅读的线程,我收集了这么多:
要么是我没有正确加载图像,这意味着我没有使用正确的代码,要么
我的 MANIFEST.mf 不包含 "Class-Path" (这意味着参数是空白的,实际上它们是)
我找不到其他代码。人们建议使用我无法正常工作的 ClassLoader。试用它给了我空指针异常。
试图研究后者并没有太大帮助,因为我找不到任何帮助信息,或者我只是什么都不明白。
package platformer.resources;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.*;
public class ImageLoader
{
static String spritePath = "src/platformer/resources/";
public static BufferedImage loadImage(String path)
{
BufferedImage img = null;
try{img= ImageIO.read(new File(spritePath+path));
}catch(IOException e){System.out.println("Couldn't load File: "+spritePath+path);}
return img;
}
public static BufferedImage flipImage(BufferedImage bufferedImage)
{
AffineTransform tx = AffineTransform.getScaleInstance(-1, 1);
tx.translate(-bufferedImage.getWidth(null), 0);
AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
bufferedImage = op.filter(bufferedImage, null);
return bufferedImage;
}
}
这是我目前使用的代码。
其他 classes 会使用 "loadImage" 或 "flipImage" 并且在 IDE 中它工作正常但是作为 .jar 它无法找到 .png.
例如 class "platformer/entities/walker.class" 会尝试打开 "Idle.png"。为此,它使用 "loadImage("/entities/enemy/walker/Idle.png")" 方法。请注意,在该方法中,实际路径最终将成为 "src/platformer/resources/entities/enemy/walker/Idle.png".
再次,如果这个问题已经得到解答,我深感抱歉,但我仍然感谢您的帮助。
迈克尔
当您的文件在 jar 中时,它们只能作为资源流取出,因此您需要使用类似的东西:
ImageLoader.class.getResourceAsStream("nameoffile").
这是因为 jar 实际上是一个压缩的目录结构,而文件并不是真正的文件,它们隐藏在压缩的 zip 格式中作为二进制文件。
我无能为力,但我想我只是错过了回答我问题的线程,但我已经找了很长时间了,似乎找不到我需要的帮助。
我的问题很简单: 我已经创建了一个游戏(或者更确切地说我正在制作它)并且我正在尝试向其中添加精灵(敌人等的 png 文件)。将它们加载到 IDE 中工作正常,但是当我创建一个 jar 文件并尝试打开它时,它只是显示 "A Java Exception has occurred"。进一步调查发现问题是它找不到我告诉它加载的文件。
通过我阅读的线程,我收集了这么多: 要么是我没有正确加载图像,这意味着我没有使用正确的代码,要么 我的 MANIFEST.mf 不包含 "Class-Path" (这意味着参数是空白的,实际上它们是)
我找不到其他代码。人们建议使用我无法正常工作的 ClassLoader。试用它给了我空指针异常。
试图研究后者并没有太大帮助,因为我找不到任何帮助信息,或者我只是什么都不明白。
package platformer.resources;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.*;
public class ImageLoader
{
static String spritePath = "src/platformer/resources/";
public static BufferedImage loadImage(String path)
{
BufferedImage img = null;
try{img= ImageIO.read(new File(spritePath+path));
}catch(IOException e){System.out.println("Couldn't load File: "+spritePath+path);}
return img;
}
public static BufferedImage flipImage(BufferedImage bufferedImage)
{
AffineTransform tx = AffineTransform.getScaleInstance(-1, 1);
tx.translate(-bufferedImage.getWidth(null), 0);
AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
bufferedImage = op.filter(bufferedImage, null);
return bufferedImage;
}
}
这是我目前使用的代码。 其他 classes 会使用 "loadImage" 或 "flipImage" 并且在 IDE 中它工作正常但是作为 .jar 它无法找到 .png.
例如 class "platformer/entities/walker.class" 会尝试打开 "Idle.png"。为此,它使用 "loadImage("/entities/enemy/walker/Idle.png")" 方法。请注意,在该方法中,实际路径最终将成为 "src/platformer/resources/entities/enemy/walker/Idle.png".
再次,如果这个问题已经得到解答,我深感抱歉,但我仍然感谢您的帮助。
迈克尔
当您的文件在 jar 中时,它们只能作为资源流取出,因此您需要使用类似的东西:
ImageLoader.class.getResourceAsStream("nameoffile").
这是因为 jar 实际上是一个压缩的目录结构,而文件并不是真正的文件,它们隐藏在压缩的 zip 格式中作为二进制文件。