【问题标题】:Java ImageIO.read(URL) returning null when it shouldn'tJava ImageIO.read(URL) 在不应该返回 null 时
【发布时间】:2016-09-27 13:50:06
【问题描述】:

好的,我花了大约 15 个小时试图弄清楚这一点。我正在开发这个导出到不可运行的 jar 文件的程序。问题是我正在尝试在 jar 中加载图像并将其设置为变量。

我看过其他帖子,我想我已经尝试了我能找到的所有东西,但似乎没有任何效果。

我不是在问如何查找图像,因为我可以获得图像的 URL,但是 ImageIO.read(URL) 没有抛出任何异常,而是返回 null。该图像是一个.png,我听说它与 ImageIO.read() 兼容。我正在使用一个 API,所以这就是 log() 行。

感谢任何帮助。谢谢!

我的项目:

    Project
    ->src
    -->package
    --->Main.java
    --->paint.png

我的代码:

在我的主要方法中: (mainPaint 是私有图像)

    mainPaint = getImage("paint.png");

方法:

private Image getImage(String fileName) {

    URL url = getClass().getResource(fileName);
    BufferedImage image = null;

    log(url.toString()); // To make sure I have the correct file
    // returning jar:file:/C:/Users/Me/MyJar.jar!/package/paint.png

    try {
        image = ImageIO.read(url);
    } catch (IOException e1) {
        log("Error converting url to image.");
        // This is not happening
    }

    if (image == null) {
        log("Image is null.");
        // This is happening
    }

    return image;
}

网址无效吗?我只是错过了什么吗?我只是想将 jar 中的本地图像保存为 Image 对象,我觉得这对于我想要做的事情来说太难了。

编辑: 我也只是尝试将 mainPaint 设为 BufferedImage 并使用:

    Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource(fileName));
    if(image == null) {
        log("Image is null");
    }
    log("Height: " + image.getHeight(null));
    log("Width: " + image.getWidth(null));

    BufferedImage bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);

    // Draw the image on to the buffered image
    Graphics2D bGr = bimage.createGraphics();
    bGr.drawImage(image, 0, 0, null);
    bGr.dispose();

    // Return the buffered image
    return bimage;

图像的高度和宽度都返回-1?

【问题讨论】:

  • ImageIO.read 捕获较小的异常 IllegalArgumentException - 如果输入为空。也是有可能的所以不要太激动
  • 我正在打印 url.toString() 并且它正在打印图像的位置,所以 url 不为空。
  • @gpasch ImageIO.read 抛出一个IllegalArgumentException,如果输入是null。它没有捕捉到那个异常。
  • @Opoz 你能附上你的PNG吗(最好从JAR中提取,以防它被任何方式破坏)?如果没有相关文件 (complete and verifiable, remember?),我们只能猜测和推测...

标签: java image url jar javax.imageio


【解决方案1】:

ImageIO.read() 将仅加载 GIF、PNG、JPEG、BMP 和 WBMP 图像类型。 任何其他图像类型都将返回 null 而不会出错。

它可以回答你的问题。

【讨论】:

【解决方案2】:

ImageIO.read() 不会加载 SVG 文件,所以如果你的图片是 SVG 格式,你需要添加插件来支持 SVG

Here 是另一个 SO 帖子,解释了您可以在哪里执行此操作。

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 2021-12-15
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多