Я пытаюсь загрузить изображение из каталога моего проекта в ресурс BufferedImage, но получаю сообщение об ошибке, в котором говорится, что он не может загрузить изображение. Вот строка с ошибкой:
final BufferedImage plusMinusIcon = ImageUtil.loadImageResource(CalculatorProPlugin.class, "plus_minus_icon.png");
И вот ошибка, которую я получаю при попытке сборки:
net.runelite.client.util.ImageUtil - Failed to load image from class:
...plugins.calculatorpro.CalculatorProPlugin path:
...plugins.calculatorpro/plus_minus_icon.png
Изображение сохраняется в каталоге проектов, и если я скопирую путь к "plus_minus_icon.png" из каталога, я получу "...plugins.calculatorpro\plus_minus_icon.png", так что это соответствует тому, что я вставил в код
РАБОЧИЙ ОТВЕТ: Используя приведенные ниже предложения Frakcool, он помог мне создать рабочее решение:
InputStream inputStream = CalculatorProPlugin.class.getResourceAsStream("/plus_minus_icon.png");
BufferedImage plusMinusIcon = null;
plusMinusIcon = ImageIO.read(inputStream);
С моими значками, хранящимися в папке ресурсов в каталоге проекта:
Вместо этого используйте встроенный ресурс:
InputStream inputStream = this.getClass().getResourceAsStream("plus_minus_icon.png");
Затем преобразуйте входной поток, как показано в этом ответе:
BufferedImage plusMinusIcon = ImageIO.read(inputStream);
Я ввел ваш код, но после запуска "inputStream == null" возвращает true
Ваше изображение должно находиться в папке resources
, как показано в учебнике Как использовать значки , также см. этот ответ для получения дополнительной информации, и вы также можете обратиться к этому руководству для объяснения, почему он должен быть в папке resources
.
Когда я System.out.println(inputStream)
получаю следующее:
java.io.BufferedInputStream@57829d67
Если его нет в папке ресурсов, я получаю ту же ошибку, что и вы
Запускаемый пример:
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
public class ImageLoader {
public static void main(String[] args) {
ImageLoader imageLoader = new ImageLoader();
imageLoader.loadResource();
}
private void loadResource() {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("plus_minus_icon.png");
System.out.println(inputStream);
try {
BufferedImage plusMinusIcon = ImageIO.read(inputStream);
System.out.println(plusMinusIcon);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@TravelKidKurty, пожалуйста, посмотрите отредактированный ответ, и, пожалуйста, нет необходимости удалять и публиковать свой комментарий снова, я знаю, что вы отчаянно нуждаетесь в ответе, но мы здесь волонтеры, и я выжимаю немного времени из своей работы, чтобы предоставить некоторые помогите здесь, повторная публикация вашего комментария, чтобы привлечь внимание кого-то, может кого-то раздражать, поэтому, пожалуйста, избегайте этого.
Извините, я не собирался дважды уведомлять вас. Я довольно новичок здесь, поэтому я подумал, что мой первоначальный комментарий не уведомит вас, если в начале не будет указан ваш тег имени, поэтому я удалил комментарий и включил ваш тег, который был автоматически удален при повторной публикации. Я ценю вашу информацию, я просмотрю все, что вы отправили, и обновлю здесь после!
@TravelKidKurty Если вы используете IntelliJ, то это может пригодиться для создания папки ресурсов.
И кстати, если вы отвечаете отвечающему на его ответ, они немедленно получают уведомление, если вы отвечаете кому-то еще, тогда вы хотите пометить их. То же самое происходит, когда вы комментируете вопрос :)
Полезно знать, ха-ха, спасибо! Также спасибо за ссылку на папку с ресурсами IntelliJ - это было очень полезно! Вчера меня отстранили от проекта, поэтому я еще не закончил реализацию всего, что вы прислали, но буду информировать вас по ходу (может быть, сегодня или не раньше следующей недели)
Я все еще получаю "null", когда печатаю inputStream... Я заметил, что во всех присланных вами примерах, которые я читал, все используют this.getClass() или некоторые его разновидности. Поскольку мой код находится в статическом контексте, IntelliJ не позволяет мне его использовать. Вместо этого я использую CalculatorProPlugin.class. Будет ли это делать что-то отличное от функции getClass()? Кроме этого, я не знаю, чем я, возможно, отличаюсь от любого из примеров, на которые я смотрел и пробовал.
(также все мои файлы .png теперь находятся в папке ресурсов в папке калькулятора pro) - я мог бы обновить OP новыми скриншотами кода и файловой структуры, если это поможет?
@TravelKidKurty это помогло бы, но не скриншоты кода, а код в виде текста в формате кода. Мне любопытно, о чем вы говорите в статическом контексте, вы должны избегать этого, насколько это возможно. Я включил пример, который создает экземпляр (и это позволяет вам использовать this
, и он больше не находится в статическом контексте, так как теперь у вас есть экземпляр)
Я наконец-то заработал как раз перед тем, как вы опубликовали свое последнее редактирование! Я добавил функцию getClassLoader(), и бум! После дальнейшего прочтения вашей ссылки, помеченной как «этот ответ» (я не знаю, как опубликовать гиперссылку в комментариях), я обнаружил, что также могу заставить ее работать без функции getClassLoader(), если я просто добавлю «/» к строка имени файла ("/plus_minus_icon.png") - клянусь, я уже пробовал это в более ранней попытке, но, возможно, у меня была неправильная какая-то другая часть функции
@TravelKidKurty, вы можете опубликовать это [The text you want to post](The url it should point to)
Я ввел ваш код, но после запуска "inputStream == null" возвращает true