3

我必须创建一个分辨率非常大的图像,但是图像相对“稀疏”,只有图像中的某些区域需要绘制。

例如下面的代码

/* this take 5GB memory */

    final BufferedImage img = new BufferedImage( 36000, 36000, BufferedImage.TYPE_INT_ARGB);

/* draw something */

    Graphics g = img.getGraphics();
    g.drawImage(....);

/* output as PNG */

    final File out = new File("out.png"); 
    ImageIO.write(img, "png", out); 

我最后创建的 PNG 图像只有大约 200~300 MB。

问题是如何避免在开始时创建 5GB BufferedImage?我确实需要一个大尺寸的图像,但颜色信息非常稀疏。

BufferedImage 是否有任何 Stream 以便它不会占用太多内存?

4

2 回答 2

1

是否有理由不使用延迟初始化的 Map 或充满较小 BufferedImages 的类似结构?

编辑:这是一个非常专业的数据结构。如果您想在图像上绘制,请以某种合理的方式平铺它们,并对每个图像应用相应的 AffineTransform。然后,您可以遍历 Collection 并绘制到每个集合,然后将其清空或 Flyweight (如果之后立即为空)。不过,我不知道将它们全部组合成 Java 中的 PNG 的非痛苦方式。

于 2010-06-11T14:32:43.607 回答
0

您的示例使用 TYPE_INT_ARGB 作为图像类型,即每像素 4 个字节。如果图像的颜色数量有限,您可能可以使用每像素更少字节的不同图像类型。

这可以减少每个像素的字节数,但最好的情况是每个像素 1 个字节,但仍将使用超过 1 GB。

否则,您可以尝试将渲染分成多个图像并将它们分别合并在一起。

于 2010-06-11T15:07:59.813 回答