Получение BufferedImage в качестве ресурса, чтобы он работал в файле JAR

#java #swing #jframe #embedded-resource #javax.imageio

#java #изображение #jar #bufferedimage

Вопрос:

Я пытаюсь загрузить изображение в свое java-приложение в виде BufferedImage с намерением заставить его работать в файле JAR. Я попытался использовать ImageIO.read(new File("images/grass.png")); который работал в IDE, но не в JAR.

Я также пробовал

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

который даже не будет работать в IDE из-за исключения NullPointerException. Я пытался сделать это с помощью ../images, /images и images в пути. Ни один из них не работает.

Я что-то здесь упускаю?

Комментарии:

1. Где находится изображение? Если вы используете eclipse, существует ли он в каталоге ресурсов? Если вы используете NetBeans, существует ли он в папке arc

2. Используя Eclipse, images — это отдельная папка вне папки src, но в папке проекта.

Ответ №1:

new File("images/grass.png") ищет каталог images в файловой системе в текущем каталоге, который является каталогом, из которого запускается приложение. Так что это неправильно.

ImageIO.read() возвращает BufferedImage и принимает URL-адрес или InputStream аргумент as. Чтобы получить URL InputStream -адрес из пути к классу, вы используете Class.getResource() или Class.getResourceAsStream() . И путь начинается с / и начинается в корне пути к классу.

Итак, следующий код должен работать, если файл grass.png находится в пакете images в пути к классу:

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

Это будет работать в IDE, если файл находится в пути к классу среды выполнения. И это будет, если IDE «скомпилирует» его в каталог целевых классов. Для этого файл должен находиться в каталоге sources вместе с вашими исходными файлами Java.

Комментарии:

1. Моя папка images (не package) находится за пределами папки src, но в папке проекта в Eclipse. Итак, мне нужно переместить папку images в src?

2. ДА. Вы должны это сделать. Если вы этого не сделаете, eclipse не скопирует папку images в целевой каталог, и изображения, таким образом, не будут частью пути к классу среды выполнения.

3. Действительно, вот так. Теперь он работает правильно. Спасибо за помощь.

4. @JBNizet: идеальный ответ.