#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: идеальный ответ.