我的程序逐个生成10 x 10个图像,每个像素为3000x3000像素(目前保存到100个名为image_x_y.jpg
的文件中)
我想将这100个图像组合成一个大图像,而不是将所有内容都加载到内存中。我的目标是创建一个30'000 * 30'000像素的大图像文件。
我正在寻找一种方法来执行此操作没有使用JAI(无法从公共maven存储库安装,我不明白为什么)
有没有办法用纯java2D做到这一点?或者是否存在另一个库,能够处理这个吗?
我最初的想法是创建一个非常大的缓冲图像,从支持磁盘上文件的DataBuffer。但我不确定这是可能的。有没有人这样做过?
答案 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>