繁体   English   中英

在java中创建一个稀疏的BufferedImage

[英]create a sparse BufferedImage in java

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

例如,使用以下代码

/* 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流,以便它不会占用太多内存?

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

编辑:这是一个非常专业的数据结构。 如果要绘制图像,请以合理的方式对其进行平铺,并为每个图像应用相应的AffineTransform。 然后你可以迭代收集并绘制到每一个并将其清空或称重它如果它后面是空白。 我不知道将它们全部组合到Java内部的PNG中的非痛苦方法。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM