【问题标题】:Getting a BufferedImage as a resource so it will work in JAR file获取 BufferedImage 作为资源,以便在 JAR 文件中工作
【发布时间】:2013-06-05 03:19:53
【问题描述】:

我正在尝试将图像作为 BufferedImage 加载到我的 java 应用程序中,目的是让它在 JAR 文件中工作。我尝试使用 ImageIO.read(new File("images/grass.png"));,它在 IDE 中有效,但在 JAR 中无效。

我也试过

(BufferedImage) new ImageIcon(getClass().getResource(
            "/images/grass.png")).getImage();

由于 NullPointerException,它甚至无法在 IDE 中工作。我尝试在路径中使用 ../images、/images 和 images 来执行此操作。这些都不起作用。

我错过了什么吗?

【问题讨论】:

  • 图像在哪里?如果您使用的是eclipse,它是否存在于资源目录中?如果您使用的是 NetBeans,它是否存在于 arc 文件夹中
  • 使用 Eclipse,images 是它自己的文件夹,在 src 文件夹之外,但在项目文件夹中。

标签: java image jar bufferedimage


【解决方案1】:

new File("images/grass.png") 在文件系统的当前目录中查找目录图像,该目录是启动应用程序的目录。所以这是错误的。

ImageIO.read() 返回一个 BufferedImage,并将 URL 或 InputStream 作为参数。要从类路径中获取 InputStream 的 URL,请使用 Class.getResource()Class.getResourceAsStream()。并且路径以 / 开头,并从类路径的根目录开始。

因此,如果grass.png 文件位于类路径中的包images 下,则以下代码应该可以工作:

BufferedImage image = ImageIO.read(MyClass.class.getResourceAsStream("/images/grass.png"));

如果文件位于运行时类路径中,这将在 IDE 中工作。如果 IDE 将其“编译”到它的目标类目录中,那将会是这样。为此,该文件必须与您的 Java 源文件一起位于源目录下。

【讨论】:

  • 我的图片文件夹(不是包)在 src 文件夹之外,但在 Eclipse 的项目文件夹中。所以我需要将 images 文件夹移动到 src 中?
  • 是的。你必须这样做。如果不这样做,eclipse 不会将图像文件夹复制到目标目录,因此图像不会成为运行时类路径的一部分。
  • 确实如此。它现在工作正常。感谢您的帮助。
  • @JBNizet:完美答案。
猜你喜欢
  • 2012-04-27
  • 2015-07-26
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2014-03-14
  • 2014-02-01
  • 2010-11-17
相关资源
最近更新 更多