【问题标题】:java huge BufferedImage in JScrollPaneJScrollPane中的java巨大BufferedImage
【发布时间】:2012-11-03 09:25:01
【问题描述】:

我需要将一个巨大的图像(用于访问颜色等的 BufferedImage)放入 JScrollPane 派生类中。在那之前没有什么很难的。

该图像是 A3 材料样本的 JPG 扫描,其大小为 13030x20840 像素,24 位,磁盘上的重量为 12MB -> RAM 中约为 800MB。

我将 BufferedImage 嵌入到一个 Jpanel 中,它作为 Scrollpane 的视图。

当我尝试滚动/拖动我的图像时,响应需要几秒钟,所以不是很方便。

我需要您的帮助,以便了解我应该如何使滚动窗格的滚动和图像拖动尽可能平滑和反应灵敏,但我很容易发现,使用这样的图像可能是不可能的。

我尝试了很多选项,例如双缓冲等。但是我对 Swing 还很陌生,那么很可能我错过了一些简单的解决方案。

如果需要通过其他方式或其他方式更改 BufferedImage,我可以接受任何解决方案。

【问题讨论】:

  • 解压缩到图像缓冲区后大小约为 750MB,而不是 12MB 的图像。
  • @Jim Garrisson:确切地说,我重写了它。感谢您关注这个细节。
  • 将您的图像分解为图块。 256 像素 x 256 像素的图块很常见。仅显示适合滚动窗格的图块。当滚动窗格滑块移动时,显示不同的图块。
  • 我已经在之前的尝试中这样做过,但它使用的是不同的编程语言。我真的不知道如何将图块放在滚动窗格中 -> 布局?
  • 您从图块构建缓冲图像,并像现在一样显示缓冲图像。唯一的技巧是在用户滚动时构建一个新的缓冲图像,并在滚动窗格中正确定位新的缓冲图像。

标签: java image jpanel jscrollpane bufferedimage


【解决方案1】:

我在那里找到了我需要的东西:

very large image manipulation and tiling

A nice book, the sample shown covers that.

Java JAI 库有很多特性可以处理这类问题,并且得到 Oracle 的支持,这意味着它(理论上)是稳定和可持续的。

感谢@BryanD!

【讨论】:

    【解决方案2】:

    所以,我们有一个 13,030 x 20,840 像素的大图像。

    如果我们将此图像分解为 256 x 256 像素的图块,我们会得到一个图块集,其中包含 51 个图块和 82 个图块。行和列中的最后一个图块将是部分图像,因为 256 不会均匀地分布在 13,030 和 20,840 中。

    假设我们的显示窗口是 400 X 400 像素。我们还假设从大图的左上角开始。

    我们拍摄并制作 3 x 3 平铺缓冲图像。这将是 768 x 768 像素,这允许足够的重叠以实现平滑滚动。我们从第一行获取前 3 个图块,从第二行获取前 3 个图块,从第三行获取前 3 个图块来制作我们的 3 x 3 图块缓冲图像。

    现在,当我们在 JScrollPane 上设置水平和垂直滚动时,我们必须将水平滚动的最大值设置为 13,030,垂直滚动的最大值设置为 20,840。这样用户就可以动态地意识到他正在滚动一个大图像。

    好的,我们显示 3 x 3 平铺缓冲图像。用户向右滚动以查看更多图像。用户滚动了 256 像素。

    应用程序现在必须构建一个新的 3 x 3 平铺缓冲图像。我们从第一行、第二行和第三行中取出第 2 到第 4 个图块。我们显示这个新的缓冲图像。对用户来说,它看起来就像一张巨大的图像。对于应用程序,会显示一系列小的 3 x 3 平铺缓冲图像。

    mKorbel 已经创建了一些 code,它可以即时构建和显示这些较小的缓冲图像。

    要处理缩放,您可以在 Java 应用程序之外调整大图像的大小并创建多个图块集。这使得 Java 应用程序代码更复杂,但比尝试调整 Java 应用程序中较小的缓冲图像的大小要快得多。

    【讨论】:

    • 耶!感谢您的链接,我没有找到它 -> 我的浏览器没有隐藏它(在您之前的评论中),原因不明......非常感谢您和 mKorbel!
    • mKorbel 的出色解决方案已实施 [[stackoverflow.com/questions/11330268/…,再次感谢您和他!我将他的解决方案与 WeakReference 数组相结合,以存储单个图块而无需硬内存持久性。没关系。
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-11-19
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多