我需要在大图像周围添加特定的填充,我正在使用的当前方法,如下面的代码片段所示,正在耗尽内存。打开PNG可以直接吸掉大约300mb的内存并制作一份副本,将我推到700mb以上所以我正在寻找一种方法来做到这一点而不会吸收所有可用的内存。有什么建议吗?
...
BufferedImage img = ImageIO.read(new File("OldWorld.png"));
BufferedImage img2 = new BufferedImage(img.getHeight()+padding,img.getWidth()+padding, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img2.createGraphics();
g2.setPaint(new Color(0,0,0,0);
g2.fillRect(0, 0, img.getHeight()+padding, img.getWidth()+padding);
g2.drawImage(img, img.getHeight(),img.getWidth(), null);
...
答案 0 :(得分:1)
没有直接的方法来解决这个问题。 在Java中使用大图像会消耗大量内存。
一些替代方案是:
使用netpbm库预处理图像 http://netpbm.sourceforge.net/。 要填充图像,请使用如下命令:
pngtopnm OldWorld.png | pnmpad -black 48 -left 48 -top 48 | pnmtopng > padded.png
减少图像中的颜色数量,以便您可以使用图像类型
BufferedImage.TYPE_INDEXED
每个像素只有一个字节而不是四个。
使用多个图块而不是单个大图像并工作 一次只有一个瓷砖。然后你避免有很多图像 记忆中的数据。