gpt4 book ai didi

java - 保存大 BufferedImage 时出现内存不足问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:26:18 25 4
gpt4 key购买 nike

我在保存大型(例如 12 000 x 9 000 )图像时遇到问题。

我正在开发一个图形编辑软件(类似于简单的 Photoshop)并且用户显然必须能够保存图像。

假设我想将图像保存为 .png。JAVA 是否总是需要使用 BufferedImage 来保存绘制的东西?

我知道图像大小的公式是:Xsize * Ysize * 4(红、绿、蓝、alpha)所以在这种情况下,我们得到超过 400 MB。

我知道我可以将图像保存为多个部分(图 block ),但用户无论如何都必须以某种方式合并它们。

有没有其他方法可以在不使用 BufferedImage 的情况下保存这么大的图像?

图片保存代码:

 public static void SavePanel() {

BufferedImage image = null;
image = new BufferedImage(
(int) (Main.scale * sizeX ),
(int) (Main.scale * sizeY ),
BufferedImage.TYPE_INT_RGB);

g2 = image.createGraphics();
panel.paint(g2);


try {
ImageIO.write(image, "png", new File(FactoryDialog.ProjectNameTxt.getText() + ".png"));
} catch (IOException e) {
}


}

提前致谢!

最佳答案

ImageIO.write(..) 方法接受一个RenderedImage,而不仅仅是一个BufferedImage。前段时间我成功地利用了这个事实来写出非常大的图像。通常,writer 实现按顺序写出图像,并仅向 RenderedImage 询问他们当前需要的部分。

通过查看您的代码,我认为应该可以破解一个 RenderedImage 实现,该实现将您的 panel 放入其构造函数中并可以传递给 ImageIO 用于编写。在此过程中,ImageIO 将从您的图像中请求数据。然后,您可以使用面板即时创建请求的片段(Raster 内容)。这样,整个图像在任何时候都不必存储在内存中。这种方法的起点是

public class PanelImage implements RenderedImage {

private final Panel panel;

public PanelImage(Panel panel) {
this.panel = panel;
}

/* implement all the missing methods, don't be afraid, most are trivial */

}

显然,您还应该检查您的面板 是否没有遇到与BufferedImage 相同的问题。根据您的应用程序的性质,您必须至少将图像保存在内存中一次(使用图 block 取模)。但这样您至少可以避免重复。

关于java - 保存大 BufferedImage 时出现内存不足问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6691915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com