在Java中创建和绘制巨大的(缓冲)图像

6
我正在开发一个应用程序,使用Java 2D绘制矩阵,这个矩阵可能会非常大,例如30000 x 30000像素。
目前我已经尝试过BufferedImage,但创建如此巨大的BufferedImage会导致内存不足异常,即使增加堆内存也无济于事。
现在我考虑将图像分成多个图像/区域,在完成某个区域后将其写入磁盘,并创建新的区域/BufferedImage并继续绘制。
我很想听听其他人对如何处理这个问题的想法。我离开Java已经有一段时间了,所以任何具体的示例都是受欢迎的。
2个回答

3
我参与了一个新的/小型开源项目,可能非常适合您的需求。
该项目是Glimpse。它旨在帮助构建Java中的2D数据可视化,重点是处理大型数据集,并使提供实时交互以轻松探索数据变得容易。

Glimpse Head Map

它利用OpenGL来利用现代GPU的硬件功能,如纹理内存和着色器,以实现上述目标。因此,如果您决定使用Java2D,则无法使用此功能。但是,Glimpse面板可以与其他Swing组件并排放置,因此很容易将其放入现有的Swing GUI中。唯一的注意事项是您需要一张不错的显卡。
该图像是一个大数据矩阵的示例,其颜色通过右侧的颜色比例动态调整(矩阵数据存储在GPU纹理中,并通过自定义着色器实现动态重新着色)。此示例的源代码为HeatMapExample.java。还有许多其他类似的示例,可提供使用Glimpse的其他功能的起点。
您可以在glimpse.metsci.com了解更多信息。主页上有一个简介视频,以及Java WebStart示例。源代码托管在GitHub上。

有趣的,我一定会研究一下。谢谢。 - RBaarda

1

如果您只想在磁盘上生成图像,则可以查看pngj - 它可以生成的PNG图像,因为它会在可用时将像素行写入磁盘。API有点针对PNG格式,但并不太复杂(在使用之前阅读一些关于PNG图像格式的背景可能会有所帮助)。


谢谢你的回答。我已经研究了pngj,但我仍在弄清楚如何使用pngj将例如BufferedImage绘制到磁盘上。 - RBaarda
你不会。我以为问题在于缓冲图像占用太多内存?PNGJ避免了这个问题-你可以直接将像素写入磁盘。如果我误解了什么,很抱歉。 - andrew cooke
抱歉让您感到困惑,但您说得对,那就是问题所在。让我这样说吧,您如何将Java 2D API与PNGJ一起使用? - RBaarda
抱歉,如果您需要在Java中使用Java图像API进行复杂处理,则不会起作用-它与其完全没有关联。但是,如果您有一些生成数据并想将其转换为图像的数字过程,并且可以逐行逐像素地计算,那么您将计算RGB值并将其发送到PNG(在那里我认为您可能会使用第三方工具来生成子集/缩小版本的图像,然后再读入Java...) - andrew cooke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接