JScrollPane 中的 java 巨大的 BufferedImage

标签 java image jpanel jscrollpane bufferedimage

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

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

我将 BufferedImage 嵌入到 Jpanel 中,作为 Scrollpane 的 View 。

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

我需要你的帮助才能知道我应该怎么做才能使滚动 Pane 的滚动和图像拖动尽可能平滑和 react 灵敏,但我很容易发现使用这样的图像可能是不可能的。

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

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

最佳答案

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

如果我们将此图像分解为 256 x 256 像素的图 block ,我们将得到一个图 block 集,其宽度为 51 个图 block ,向下为 82 个图 block 。行和列中的最后一个图 block 将是部分图像,因为 256 不会均匀地进入 13,030 和 20,840。

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

我们拍摄并制作一张 3 x 3 平铺缓冲图像。这将是 768 x 768 像素,它允许足够的重叠以实现平滑滚动。我们使用第一行的前 3 个图 block 、第二行的前 3 个图 block 和第三行的前 3 个图 block 来制作我们的 3 x 3 图 block 缓冲图像。

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

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

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

mKorbel 已经创造了一些 code动态构建和显示这些较小的缓冲图像。

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

关于JScrollPane 中的 java 巨大的 BufferedImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386332/

相关文章:

java - 在 Process Builder 中切换用户

Java下载 "google-formatted"图像

php - 未定义索引不知道为什么

CSS blogspot后台定位帮助

java - GraphicsDevice 和 JOptionPane 问题

JavaFX 2.2 删除分页的选定页面标签

c# - 删除测试驱动开发中的重复

java - 在每个循环中从 ArrayList 中删除对象

java - 图形对象未显示在屏幕上

java - JPanel 内的 JPanel