首页 > 解决方案 > 使用 BufferedImage 将图像加载到 Java - Oracle 教程

问题描述

我是 Java 的初学者,我想用这个脚本加载一个图像:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

/**
 * This class demonstrates how to load an Image from an external file
 */
public class LoadImageApp extends Component {

BufferedImage img;

public void paint(Graphics g) {
    g.drawImage(img, 0, 0, null);
}

public LoadImageApp() {
   try {
       img = ImageIO.read(getClass().getResource("/resources/java.png"));//cannot found image
   } catch (IOException e) {
   }

}

public Dimension getPreferredSize() {
    if (img == null) {
         return new Dimension(100,100);
    } else {
       return new Dimension(img.getWidth(null), img.getHeight(null));
   }
}

public static void main(String[] args) {

    JFrame f = new JFrame("Load Image Sample");

    f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    f.add(new LoadImageApp());
    f.pack();
    f.setVisible(true);
}
}

然后我把一张图片放在文件夹资源“resources”上,把图片所在位置的名字改成“/resources/java.png”,编译的时候出现一个没有图片的空窗口。

您可以在这里看到错误:https ://ibb.co/ysjNyQw

标签: javaimageembedded-resource

解决方案


例如,您要做的第一件事是对“嵌入式资源”进行一些研究

我不用Eclipse,我用Netbeans,但是流程应该是一样的

项目

如您所见,我已将图像放在resources项目“源”中的包中。这将确保它在运行时通过类路径搜索机制可用(并在我导出时嵌入到生成的 Jar 文件中)。

然后我用 aJLabel来显示它...

示例图片

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }

                    BufferedImage image = ImageIO.read(getClass().getResource("/resources/java.png"));
                    JLabel label = new JLabel(new ImageIcon(image));

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(label);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }
}

现在,如果您想继续使用自定义绘画路线,我建议您阅读:

更好地了解绘画在 Swing 中的工作原理以及您应该如何使用它


推荐阅读