我正在开发一个每隔一段时间重新加载一次图像的应用程序。 我做到了,所以我可以在外面做出改变。我正在使用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();
}
}
任何人都知道如何解决这个问题?
谢谢!
答案 0 :(得分:0)
在Windows上(我假设您在Windows上,正如您提到的那样使用Paint.NET),保留文件特别有问题,因为它会阻止其他应用程序写入同一文件。最有可能的是,这是你遇到的问题。
打开流时,就像在此处一样:
new FileInputStream(ref);
您获取本机文件指针。您有责任在使用后再次关闭它,以释放文件指针。现在,ImageIO.read(InputStream)
应为您关闭流,但在某些情况下和某些版本的Java中,存在与此相关的错误。如果流未正确关闭,Java进程将保留此文件指针作为最坏的情况,直到Java进程终止。
好消息是,如果您只是将代码更改为:
BufferedImage image = ImageIO.read(new File(ref));
然后ImageIO
将始终处理流的打开和关闭。