2010-08-05 52 views
7

我的程序产生3000x3000像素,一个接一个的10×10格的图像(目前保存的100个文件名为image_x_y.jpg如何从java中的多个tile创建一个大的图像文件?

我想这100张图像组合成一个大的图像,而无需加载在内存中的一切。我的目标是创建一个30'000 * 30'000像素的大图像文件。

我正在寻找一种方式来做到这一点不使用JAI(不能从公共Maven仓库安装了,我不明白为什么)

有没有办法用纯的Java2D做到这一点?还是有另一个图书馆存在,能够处理这个?

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

回答

6

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

我相信在JAI中有一个类可以做到这一点。无论您将JAI整合到您的项目中是否存在任何问题,我都会坚持而不是推出自己的版本。 Java2D中没有这样的东西。

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

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

  • 由一个ByteBuffer而不是数组支持的DataBuffer(如果缓冲区指挥它可以映射到一个文件中。)
  • 一个WritableRaster类似于标准的栅格,但使用我的实现的DataBuffer(标准JDK中作弊被抱着支持数组引用栅格。有一个在直接ByteBuffer的情况下没有数组所以很遗憾,你必须重新实现最Raster方法。)

我做不建议延长SampleModel,因为您的班级将不能与JDK栅格一起工作(Java2D中的各种方法,包括Raster工厂方法会在SampleModel的开关类型上假设它是标准方法之一。糟糕的设计恕我直言,但你可以做的不多,除非遵循相同的模式。)

+0

好吧,它明确表示使用JAI是最聪明的解决方案。我会继续这种方式,并不会自己处理图像。 – 2010-08-06 05:37:06

+1

有关如何实现这一点的更多细节将受到欢迎 – 2011-05-12 17:22:51

1

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

+0

未压缩的文件会很大。每像素24位,每块大约30MB。 (请参阅http://en.wikipedia.org/wiki/BMP_file_format)。我真的认为它会回报看看不同的实现。 – extraneon 2010-08-05 09:37:11

1

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

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

由于涉及到所有的压缩,处理BMP上的图像大小(大约100 * 30MB = 3GB)可能不是最佳也不快速,所以不要绕着你自己摆弄这个问题。

1

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

有关大图像处理read this article的更多信息。

相关问题