使用InputStream加载图像

时间:2015-10-24 22:07:36

标签: java jar

在我的IDE中,我能够获取资源文件夹中的图像路径,并通过执行以下操作使该路径成为新文件对象:

URL imagePath = getClass().getResource("/image.png");
try
{
    //Convert the URLs into URIs and make a file object with that path
    File image = new File(imagePath.toURI());

}
catch (URISyntaxException e)
{
    e.printStackTrace();
}

但是当我制作我的程序的jar文件时,我得到的错误URI不是分层的。我做了一些研究,发现我必须使用getResourceAsStream()方法创建一个InputStream。但我不知道如何为图像做这项工作。我只需要能够从我的资源文件夹中获取图像的路径。即使它是一个罐子,我怎么能做这个工作。

2 个答案:

答案 0 :(得分:2)

不要将URL转换为File引用,这会使嵌入式资源和嵌入资源只是zip文件中的条目失败,因此不能将它们视为File

相反,请使用ImageIO.read(imagePath)

之类的内容

有关详细信息,请参阅Reading/Loading an Image

答案 1 :(得分:1)

我认为在这种情况下,最佳解决方案是直接向ClassLoader询问InputStream(使用ClassLoader.getResourceAsStream)并将其传递给ImageIO.read

这是一个完整的例子。

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;

public final class Main {

    public static void main(final String[] args) {
        final ClassLoader clsldr = Main.class.getClassLoader();
        for (final String path : args) {
            try {
                InputStream is = null;
                BufferedImage image = null;
                try {
                    is = clsldr.getResourceAsStream(path);
                    if (is != null) {
                        image = ImageIO.read(is);
                        if (image != null) {
                            // Do something with the image.
                            System.out.printf("%s: %d x %d%n",
                                              path,
                                              image.getWidth(),
                                              image.getHeight());
                        } else {
                            System.err.printf("error: %s: %s%n",
                                              path,
                                              "not a valid image file");
                        }
                    } else {
                        System.err.printf("error: %s: %s%n",
                                          path,
                                          "no such resource");
                    }
                } finally {
                    if (is != null) {
                        is.close();
                    }
                }
            } catch (final IOException e) {
                System.err.printf("error: %s: %s%n", path, e.getMessage());
            }
        }
    }

}

假设我有一个图片文件photo.jpg,然后编译上面的文件并创建一个这样的JAR文件

$ javac *.java
$ jar -cfe example.jar Main *.class photo.jpg

然后我可以像这样运行程序并获得以下输出。

$ java -jar example NoSuchThing Main.class photo.jpg
error: NoSuchThing: no such resource
error: Main.class: not a valid image file
photo.jpg: 328 x 328