【问题标题】:Loading a jpeg image within a jar在 jar 中加载 jpeg 图像
【发布时间】:2014-03-28 11:18:52
【问题描述】:

我知道这个问题已经回答了太多次,但无论我尝试什么解决方案,我都无法解决它。
我想使用 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 项目。

【问题讨论】:

    标签: java image swing embedded-resource


    【解决方案1】:

    你的图片路径有点正确...

    但是……

    使用getClassLoader()时,不要在images前面使用多余的/

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

    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");
    

    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
    

    【讨论】:

      【解决方案2】:

      你可以试试这个

       Image img = Toolkit.getDefaultToolkit().getImage(  
       YourClassName.class.getResource("/images/bg.jpg"));  
      

      【讨论】:

        【解决方案3】:

        图像的输入流是null。可能,您正在查看图像的错误路径。或者没有读取权限

        【讨论】:

          【解决方案4】:

          首先检查图像的路径,你可以尝试不使用/它可能会解决你的问题。

          【讨论】:

            【解决方案5】:

            我回来添加答案,因为在上次解决我的问题后它再次显示并且我无法再加载图像。我很沮丧,但经过更多搜索后,我找到了另一个明确的答案。
            这个想法是在构建项目后创建的目标文件夹中找到资源,从那里您可以找到要加载的资源的路径。 这是答案的链接:
            How to correctly get image from 'Resources' folder in NetBeans

            【讨论】:

              猜你喜欢
              • 2012-09-08
              • 1970-01-01
              • 2013-03-13
              • 2012-06-24
              • 2013-01-11
              • 1970-01-01
              • 2013-09-04
              • 1970-01-01
              相关资源
              最近更新 更多