如何从java中的许多tile创建一个大图像文件?

我的程序生成10 x 10个图像,每个像素为3000×3000像素(目前保存到100个名为image_x_y.jpg文件)

我想将这100个图像组合成一个大图像,而不是将所有内容都加载到内存中。 我的目标是创建一个30’000 * 30’000像素的大图像文件。

我正在寻找一种方法来做到这一点, 而不使用JAI(不能从公共maven存储库安装,我不明白为什么)

有没有办法用纯java2D做到这一点? 或者是否存在另一个库,能够处理这个?

我最初的想法是创建一个非常大的缓冲图像,从支持DataBuffer到磁盘上的文件。 但我不确定这是可能的。 有没有人这样做过?

我想将这100个图像组合成一个大图像,而不是将所有内容都加载到内存中。 我的目标是创建一个30’000 * 30’000像素的大图像文件。

我相信JAI中有一个类可以做到这一点。 无论您将JAI集成到项目中遇到什么问题,我都会坚持不懈而不是推出自己的版本。 在Java2D中没有这样的东西。

我最初的想法是创建一个非常大的缓冲图像,从支持DataBuffer到磁盘上的文件。 但我不确定这是可能的。 有没有人这样做过?

是的,我写了一个不完整的实现。 它包括

  • ByteBuffer而不是数组支持的DataBuffer (如果缓冲区是直接的,则可以映射到文件。)
  • 类似于标准栅格的WritableRaster ,但是使用我的DataBuffer实现(JDK作弊中的标准栅格,通过保持对后备数组的引用。在直接ByteBuffer的情况下没有数组,所以不幸的是你必须重新实现大多数Raster方法。)

我不建议扩展SampleModel因为你的类不适用于JDK栅格(Java2D中的各种方法,包括Raster工厂方法切换SampleModel的类型,假设它是标准的一个。糟糕的设计恕我直言,但你不能太多除了遵循相同的模式,这样做。)

我不知道是否可以将所有东西都加载到内存中。 您可以将所有图像转储到未压缩的bmp,​​然后使用一些外部工具将其转换为jpg。

如果您在使用公共maven存储库中的资源时遇到问题,可能需要使用Nexus ,maven代理,并在那里手动添加JAI jar(并将其添加到您的存储库列表中)。

选择这个解决方案的好处是你可以使用JAI,并且可以采用标准方式以maven方式使用非maven资源(所有javax库)。

不要在你自己周围摆弄这个问题,由于所涉及的所有压缩并且在磁盘上处理BMP,成像问题很复杂,因为你的图像尺寸(大约100 * 30MB = 3GB)可能不是最佳的也不是快速的。

解决方案是BigBufferedImage 。 它可以加载和存储比内存限制更大的图像。 诀窍是它的缓冲区被基于文件的DataBuffer实现替换。 它将解码的原始图像数据存储在文件中。 没有使用RAM。 这可以防止OutOfMemoryException。

有关大图像处理的更多信息,请阅读本文 。