【问题标题】:Load image from a filepath via BufferedImage通过 BufferedImage 从文件路径加载图像
【发布时间】:2013-10-27 03:30:38
【问题描述】:

我在使用 Java 应用程序时遇到问题,尤其是从我计算机中的某个位置加载图像时。

this post 之后,我使用BufferedImageInputFileStream 在我的计算机上加载图像。首先,我将图像 (pic2.jpg) 放入源代码中,并且可以正常工作。但是,如果我把图像放到另一个地方(比如说C:\\ImageTest\pic2.jpg),Java IDE 会显示一个IllegalArgumentException

return ImageIO.read(in);

代码如下:

public class MiddlePanel extends JPanel {
    private BufferedImage img;

    public MiddlePanel(int width) {    
        //img = getImage("pic2.jpg");       
        img = getImage("C:\\ImageTest\\pic2.jpg");

        this.setPreferredSize(new Dimension(800,460));

    }

    public void paintComponent(Graphics g) {
        // ...
    }

    private BufferedImage getImage(String filename) {
        // This time, you can use an InputStream to load
        try {
            // Grab the InputStream for the image.                    
            InputStream in = getClass().getResourceAsStream(filename);

            // Then read it.
            return ImageIO.read(in);
        } catch (IOException e) {
            System.out.println("The image was not loaded.");
            //System.exit(1);
        }

        return null;
    }
}

【问题讨论】:

  • 请看看这个answer,希望对你有帮助:-)

标签: java image embedded-resource bufferedimage


【解决方案1】:

在这种情况下,您不能使用 Class#getResource(String)Class#getResourceAsStream(String)。搜索与给定类关联的资源的规则由该类的定义类加载器实现。这个方法委托给这个对象的类加载器。如果此对象由引导类加载器加载,则该方法将委托给 ClassLoader.getSystemResourceAsStream(java.lang.String)

在委托之前,使用此算法从给定的资源名称构造一个绝对资源名称:

如果名称以/ (\u002f) 开头,则资源的绝对名称是名称中/ 之后的部分。 否则,绝对名称的格式如下: modified_pa​​ckage_name/name

modified_pa​​ckage_name 是这个对象的包名,用/ 代替. (\u002e)。

通常,在代码中硬编码资源的系统位置并不是一件好事。简洁明了的方法是将资源放在类路径中并访问它们。希望这可以澄清为什么它不起作用

【讨论】:

    【解决方案2】:
    //This code snippet read an image from location on the computer and writes it to a different location on the disk
    try {
        byte[] imageInByte;
    
        BufferedImage imageOnDisk = ImageIO.read(new File("C:\\ImageTest\\pic2.jpg"));
    
        //Create a ByteArrayOutputStrea object to write image to
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
        //Write the image to the OutputStream
        ImageIO.write(imageOnDisk, "jpg", baos);
    
        baos.flush();
    
        //Initialise the byte array object with the image that was written to the OutputStream
        imageInByte = baos.toByteArray();
        baos.close();
    
        // convert byte array back to BufferedImage
        InputStream in = new ByteArrayInputStream(imageInByte);
        BufferedImage bImageFromConvert = ImageIO.read(in);
    
        //write the image to a new location with a different file name(optionally)
        ImageIO.write(bImageFromConvert, "jpg", new File(
                "c:\\index.jpg"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • 将代码复制并粘贴到您的 main 方法中并进行测试。它有效!
    【解决方案3】:

    要查找图像的宽度、高度和大小

    BufferedImage image = null;    
    int imageWidth = -1;
    int imageHeight = -1;
    int fileSize = -1;
    try {
        File imageFile = new File(imagePath);
        int fileSize = (int) imageFile.length();
        image = ImageIO.read(imageFile); // Reading the Image from the file system
        imageWidth = image.getWidth();
        imageHeight = image.getHeight();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • 你可以为你在这里做的事情添加一些背景吗?
    【解决方案4】:

    要从非相对路径读取 .jpg 文件,您可以使用以下命令:

    BufferedImage img = null;
    
    try 
    {
        img = ImageIO.read(new File("C:/ImageTest/pic2.jpg")); // eventually C:\\ImageTest\\pic2.jpg
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
    

    我目前没有任何Java环境,所以希望它可以正常工作并正确编写。

    【讨论】:

    • @Andrew Thompson 是的,它是需要的,在没有任何 java 环境的情况下编写它时更是如此。
    【解决方案5】:

    getResource & getResourceAsStream 不适用于文件路径,但路径相对于代码库。如果代码库是C:,那么定位资源的相对路径是/ImageTest/pic2.jpg

    ..FileInputStreamgetResourceAsStream加载文件的区别?

    一个主要区别是 getResource.. 将与 Jar 中的资源一起使用,而 Jar 不再是 File。因此FileInputStream不能用于访问这样的资源。

    【讨论】:

    • 是的,我使用 FileInputStream 来加载文件路径,它可以工作:D,非常感谢:D。能否请您告诉我通过 FileInputStream 和 getResourceAsStream 加载文件的区别?
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多