【问题标题】:Creating and drawing huge (Buffered) images in Java在 Java 中创建和绘制巨大的(缓冲的)图像
【发布时间】:2012-05-04 07:14:39
【问题描述】:

我正在开发一个绘制矩阵的应用程序 - 使用 Java 2D - 它可以变得非常大,例如 30000 x 30000 像素。 目前我已经对 BufferedImage 进行了一些试验,但创建如此巨大的 BufferedImage 会导致内存不足异常,即使在扩大堆时也是如此。 现在我正在考虑将图像分成几个图像/区域,当我在某个区域完成时将其写入磁盘并创建一个新区域/BufferedImage 并继续绘制。 我对其他人如何处理这个问题的想法很感兴趣。我已经离开 Java 一段时间了,所以欢迎任何具体的例子。

【问题讨论】:

    标签: java image-processing java-2d


    【解决方案1】:

    我为一个新的/小型开源项目做出了贡献,该项目可能非常适合您的需求。

    项目是Glimpse。它旨在帮助在 Java 中构建 2D 数据可视化,重点是很好地处理大型数据集,并使其易于提供实时交互性以轻松探索数据。

    它利用OpenGL 来利用现代 GPU 上的硬件功能(如纹理内存和着色器)来实现上述目标。因此,如果您打算使用 Java2D,那么这对您不起作用。但是,Glimpse 面板可以与其他 Swing 组件并排放置,因此可以轻松放入现有的 Swing GUI。唯一需要注意的是,您需要一块像样的显卡。

    图像是一个大型数据矩阵的示例,其颜色通过右侧的色标进行动态调整(矩阵数据存储在 GPU 纹理中,动态重新着色通过自定义着色器完成) .此示例的来源是HeatMapExample.java。还有许多其他类似的示例为使用 Glimpse 的其他功能提供了起点。

    您可以在glimpse.metsci.com 了解更多信息。首页上有一个介绍视频,还有Java WebStart examples。源代码托管在GitHub

    【讨论】:

    • 有趣,一定会研究这个。谢谢。
    【解决方案2】:

    如果您只想在磁盘上生成图像,请查看pngj - 它可以毫无问题地生成 big png 图像,因为它会在可用时将像素行写入磁盘。该 api 有点特定于 png,但它并不太复杂(在使用它之前阅读 png 图像格式的一些背景可能会有所帮助)。

    【讨论】:

    • 感谢您的回答。我已经研究了 pngj,但我仍在弄清楚如何使用 pngj 将 BufferedImage 绘制到磁盘。
    • 你不会的。我认为问题是缓冲图像占用了太多内存? pngj 避免了这种情况 - 您将像素直接写入磁盘。对不起,如果我误解了。
    • 很抱歉让您感到困惑,但您是对的,这就是问题所在。这么说吧,Java 2D api 和 PNGJ 一起怎么用?
    • 再说一遍,你不会的! :o) 对不起。如果您需要使用 Java 图像 API 在 Java 中进行复杂的处理,那么它将无法工作 - 它根本没有连接到它。它是完全独立的。但是,如果您有一些数值过程可以生成要转换为图像的数据,并且您可以沿行逐个像素地进行计算,那么您将计算 rgb 值并将它们发送到 png(其中我以为您可能会使用 3rd 方工具来生成图像的子集/缩放版本,然后可以读入 java...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多