【问题标题】:creating huge BufferedImage创建巨大的 BufferedImage
【发布时间】:2012-02-23 18:29:10
【问题描述】:

我无法创建一个巨大的 BufferedImage(内存不足不是问题)。有人有什么想法吗?

1.新的 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。新的 BufferedImage(10000, 1000000, BufferedImage.TYPE_INT_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)

【问题讨论】:

  • 你想做什么?
  • 您意识到这样的图像需要大约 30Gb 才能保存在内存中,对吧?请回答 Alastair 的问题,因为无论您想要达到什么目标,您似乎都走错了路。
  • 我实际上有超过 30 演出的内存。我正在尝试将数据的图像表示保存到 png 文件中。谢谢。
  • 将 BufferedImage 写入 png 文件非常简单 (docs.oracle.com/javase/tutorial/2d/images/saveimage.html)。我关心的更多是为什么你有如此巨大的形象。它是否意味着是一个精灵表或某种数据库?因为 Java 对图像的大小设置了(合理的)限制,所以我们需要了解更多信息,以便我们提出不同的策略。
  • “我实际上有超过 30 GB 的内存。” 您的 PC 所拥有的内存与 JRE 所拥有的内存不同。使用 32 位 VM 的 AFAIR 最多可以为 Java 应用程序分配 2Gb。

标签: java image swing awt


【解决方案1】:

我相信这是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。

更新:看起来http://code.google.com/p/pngj/PNGJ 库就是为此目的而创建的。

【讨论】:

  • 是的,有很多。我相信它们是在 Java 通过 ImageIO 在 Java 5 中添加对 PNG 的支持之前编写的(尽管 ImageIO 非常慢)。
  • 其实我是为了自己的需要写的PNGJ库:低层顺序读/写巨大的PNG图片(包括48位),与BufferedImage/ImageIO解耦
猜你喜欢
  • 2012-11-03
  • 2015-09-04
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2021-11-17
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多