我正在开发一个应用程序,它使用Java 2D绘制矩阵 - 它可以变得非常大,例如30000 x 30000像素。 此时我用BufferedImage进行了一些实验,但是创建如此庞大的BufferedImage会导致内存不足异常,即使在扩大堆时也是如此。 现在我正在考虑将图像分成几个图像/区域,当我在某个区域完成时,将其写入磁盘并创建一个新区域/ BufferedImage并继续绘制。 我对其他人如何处理这个问题感兴趣。我已经离开Java一段时间了,所以欢迎任何具体的例子。
答案 0 :(得分:3)
我参与了一个新的/小型开源项目,可能非常适合您的需求。
项目是Glimpse。它旨在帮助构建Java中的2D数据可视化,重点是处理大型数据集,并使其易于提供实时交互,以便轻松探索数据。
利用OpenGL利用现代GPU(如纹理内存和着色器)上的硬件功能来实现上述目标。因此,如果你开始使用Java2D,那么这对你不起作用。但是,Glimpse面板可以与其他Swing组件并排放置,因此很容易放入现有的Swing GUI。唯一需要注意的是你需要一块像样的显卡。
图像是大型数据矩阵的一个示例,其颜色通过右侧的色标进行动态调整(矩阵数据存储在GPU纹理中,动态重新着色通过自定义着色器完成) 。此示例的来源是HeatMapExample.java。还有很多其他的例子,它们为使用Glimpse的其他功能提供了起点。
您可以在glimpse.metsci.com了解详情。首页上有一个介绍视频,以及Java WebStart examples。来源位于GitHub。
答案 1 :(得分:1)
如果您只是想在磁盘上生成图像,那么请查看pngj - 它可以生成大 png图像而没有任何问题,因为它会将像素行写入磁盘可用。 api是一个特定的png,但它并不太复杂(在使用它之前阅读png图像格式的一些背景可能会有所帮助)。