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

时间:2010-08-05 08:03:28

标签: java tiles java-2d

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

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

我正在寻找一种方法来执行此操作没有使用JAI(无法从公共maven存储库安装,我不明白为什么)

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

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

3 个答案:

答案 0 :(得分:6)

  

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

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

  

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

选择此解决方案的好处在于您将拥有JAI,并且可以采用标准方式以maven方式使用非maven资源(所有javax库)。

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