Java ImageIO声称图像

时间:2014-05-09 09:34:07

标签: java javax.imageio paint.net

我正在开发一个每隔一段时间重新加载一次图像的应用程序。 我做到了,所以我可以在外面做出改变。我正在使用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();
    }
}

任何人都知道如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

在Windows上(我假设您在Windows上,正如您提到的那样使用Paint.NET),保留文件特别有问题,因为它会阻止其他应用程序写入同一文件。最有可能的是,这是你遇到的问题。

打开流时,就像在此处一样:

new FileInputStream(ref);

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

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

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

然后ImageIO将始终处理流的打开和关闭。