gpt4 book ai didi

java - 在 jar 中加载 jpeg 图像

转载 作者:行者123 更新时间:2023-12-01 08:04:22 24 4
gpt4 key购买 nike

我知道这个问题已经被回答了太多次,但无论我尝试什么解决方案,我都无法解决它。
我想使用 jpeg 图像作为背景,但无论我如何尝试都无法解决它。

下面是我的最终包结构:

images/  
-- bg.jpeg
org/
-- Main.java (used for test)

代码

public class Main {
BufferedImage img;
public static void main(String[] args) {
Main main = new Main();
main.load();
}
public void load(){
try {
ClassLoader cl = this.getClass().getClassLoader();
System.out.println("CL:"+cl);
InputStream url = getClass().getClassLoader().getResourceAsStream("/images/bg.jpg");
System.out.println("URL:"+url);
this.img = ImageIO.read(url); // Null argument exception
} catch (IOException ex) {
Logger.getLogger(BoardView.class.getName()).log(Level.SEVERE, null, ex);
}
}}

输出

CL:sun.misc.Launcher$AppClassLoader@15663a2   
URL:null
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1348)
at org.Main.load(Main.java:32)
at org.Main.main(Main.java:24)

我正在使用 JDK7 和 Maven 项目。

最佳答案

您的图像路径有些正确...

但是...

使用getClassLoader()时,不要在images前面使用额外的/

getClass().getClassLoader().getResourceAsStream("images/bg.jpg");

enter image description here

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Main {

BufferedImage img;

public static void main(String[] args) {
Main main = new Main();
main.load();
}

public void load() {
try {
ClassLoader cl = this.getClass().getClassLoader();
System.out.println("CL:" + cl);
InputStream url = getClass().getClassLoader().getResourceAsStream("resources/stackoverflow5.png");
System.out.println("URL:" + url);
this.img = ImageIO.read(url); // Null argument exception
JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)), "No ClassLoader", JOptionPane.PLAIN_MESSAGE);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
<小时/>

如果您_不使用getClassLoader(),那么您确实需要它

getClass().getResourceAsStream("/images/bg.jpg");

enter image description here

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Main {

BufferedImage img;

public static void main(String[] args) {
Main main = new Main();
main.load();
}

public void load() {
try {
ClassLoader cl = this.getClass().getClassLoader();
System.out.println("CL:" + cl);
InputStream url = getClass().getClass().getResourceAsStream("/resources/stackoverflow5.png");
System.out.println("URL:" + url);
this.img = ImageIO.read(url); // Null argument exception
JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(img)), "With ClassLoader", JOptionPane.PLAIN_MESSAGE);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
<小时/>

为什么?...

尽可能简单地说明 here

  • 当您使用.getClass().getResource(fileName)时,它会考虑文件名的位置与调用的位置相同类。
  • 当您使用.getClass().getClassLoader().getResource(fileName)时考虑文件名从根开始的位置
<小时/>

注意:我的文件结构与您的类似

ProjectRoot
resources
stackoverflow5.png
mypackage
Main.java

关于java - 在 jar 中加载 jpeg 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22711396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com