我必须创建一个分辨率非常高的图像, 但是图像相对“稀疏”,只需要绘制图像中的某些区域。
例如,使用以下代码
/* 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流,以便它不会占用太多内存?
答案 0 :(得分:1)
是否有理由不使用延迟初始化的Map或类似结构的小型BufferedImages?
编辑:这是一个非常专业的数据结构。如果要绘制图像,请以合理的方式对其进行平铺,并为每个图像应用相应的AffineTransform。然后你可以迭代收集并绘制到每一个并将其清空或称重它如果它后面是空白。我不知道将它们全部组合到Java内部的PNG中的非痛苦方法。
答案 1 :(得分:0)
您的示例使用TYPE_INT_ARGB作为每像素4个字节的图像类型。如果图像的颜色数量有限,则可以使用不同的图像类型,每个像素的字节数更少。
这可以减少每个像素的字节数,但最好的情况是每个像素1个字节,仍然会使用超过1 GB。
否则你可以尝试将渲染分成多个图像并将它们分开合并在一起。