【问题标题】:Java ImageIO claims imageJava ImageIO 声明图像
【发布时间】:2014-05-09 09:34:06
【问题描述】:

我正在开发一个每隔一段时间重新加载图像的应用程序。 我这样做是为了可以在外部进行更改。我正在使用 ImageIO.read(path) 来读取图像文件。

现在,当我想用​​我的paint.NET 更改图像并尝试保存(覆盖)图像时,paint.NET 会引发 IOException。这可能是因为 ImageIO 只是在进程运行时声称该图像是他的。但这就是我的想法。

代码在这里:

public int width, height;
public int[] pixels;

public Sprite(String ref) {
    try {
        BufferedImage image = ImageIO.read(new FileInputStream(ref));
        width = image.getWidth();
        height = image.getHeight();
        pixels = new int[width * height];
        pixels = image.getRGB(0, 0, width, height, pixels, 0, width);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

有人知道如何解决这个问题吗?

谢谢!

【问题讨论】:

标签: java javax.imageio paint.net


【解决方案1】:

在 Windows 上(我假设您在 Windows 上,因为您提到您使用的是 Paint.NET),持有一个文件特别成问题,因为它会阻止其他应用程序写入同一个文件。这很可能是您遇到的问题。

当你打开一个流时,就像你在这里做的那样:

new FileInputStream(ref);

您获得了一个本地文件指针。您有责任在使用后再次关闭它,以释放文件指针。现在,ImageIO.read(InputStream)应该为您关闭流,但在某些情况下和某些 Java 版本中,存在与此相关的错误。如果流没有正确关闭,Java 进程将持有这个文件指针作为最坏的情况,直到 Java 进程终止。

好消息是,如果您只需将代码更改为:

BufferedImage image = ImageIO.read(new File(ref));

然后ImageIO 将始终负责流的打开和关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2011-11-02
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多