H5W3
当前位置:H5W3 > java > 正文

java保存大的BufferedImage时内存不足

保存大型(f.e. 12000 x 9 000)图像时出现问题。

我正在开发图形编辑软件(例如简单的Photoshop),并且
用户显然必须具有保存图像的能力。

可以说我想将图像另存为.png。
JAVA是否总是需要使用BufferedImage保存绘制的东西吗?

我知道图像大小的等式是:
Xsize * Ysize * 4(红色,绿色,蓝色,alpha)
因此,在这种情况下,我们可以获得超过400 MB的内存。

我知道我可以将图像保存为部分(图块),但是用户无论如何都必须将它们合并。

还有其他方法可以在不使用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。不久前,我成功利用这一事实写出了非常大的图像。通常,编写器实现会顺序写出图像,并仅向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 */
}

显然,您还应该检查panel是否没有遇到与BufferedImage相同的问题。根据您应用程序的性质,无论如何,您都必须至少将图像保存在内存中一次(使用图块为模)。但是通过这种方式,您至少可以避免重复。

本文地址:H5W3 » java保存大的BufferedImage时内存不足

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址