创建巨大的BufferedImage

9
我无法创建一个巨大的BufferedImage(内存不足不是问题)。有人有什么想法吗?
1. new BufferedImage(10000, 1000000, BufferedImage.TYPE_3BYTE_BGR);
Exception in thread "main" java.lang.NegativeArraySizeException
    at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:42)
    at java.awt.image.Raster.createInterleavedRaster(Raster.java:253)
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:368)

2. new BufferedImage(10000, 1000000, BufferedImage.TYPE_INT_RGB);

这段代码创建了一个宽度为10000像素,高度为1000000像素的RGB格式的缓冲图像。
Exception in thread "main" java.lang.IllegalArgumentException: Dimensions (width=10000 height=1000000) are too large    
at java.awt.image.SampleModel.<init>(SampleModel.java:112)
    at java.awt.image.SinglePixelPackedSampleModel.<init>(SinglePixelPackedSampleModel.java:124)
    at java.awt.image.Raster.createPackedRaster(Raster.java:770)
    at java.awt.image.Raster.createPackedRaster(Raster.java:466)
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1015)
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:315)

2
你想要做什么? - Alastair
4
你意识到这样的图像需要大约30GB的内存才能保存,对吗?请回答Alastair的问题,因为无论你想要实现什么,你似乎都在错误的道路上。 - Andrew Thompson
我实际上有超过30GB的内存。我正在尝试将数据的图像表示保存为PNG文件。谢谢。 - Josh G
1
将BufferedImage写入png文件非常简单(http://docs.oracle.com/javase/tutorial/2d/images/saveimage.html)。我更关心的是为什么你有这样一个巨大的图像。它是用来做精灵表或某种数据库吗?因为Java对图像大小有(合理的)限制,我们需要了解更多信息,以便提出不同的策略建议。 - Alastair
1
"我实际上拥有超过30GB的内存。" 你的电脑所拥有的内存与JRE所拥有的内存不同。据我所知,32位VM最多可以为Java应用程序分配2GB的内存。 - Andrew Thompson
1个回答

17

我认为这是 Raster 类的一个限制。 Width * Height 的值必须小于 Integer.MAX_VALUE

http://docs.oracle.com/javase/7/docs/api/java/awt/image/Raster.html

作为一种解决方法,我可能会将我的 BufferedImage 分成多个部分,其中宽度和高度都小于 Integer.MAX_VALUE 的平方根,也就是 46,340x46,340 最大。

更新:看起来 PNGJ 库是专门为此目的创建的。


1
是的,有很多。我相信它们是在Java 5之前编写的,因为Java 5通过ImageIO添加了对PNG的支持(尽管ImageIO非常慢)。 - Alastair
实际上,我编写PNGJ库是为了满足自己的需求:在低级别上顺序读/写大型PNG图像(包括48位),并与BufferedImage/ImageIO解耦。 - leonbloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接