2

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

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

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

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

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

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

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

4

2 回答 2

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 已经创建了一些代码来动态构建和显示这些较小的缓冲图像。

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

于 2012-11-15T14:04:02.390 回答
0

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

非常大的图像处理和平铺

一本好书,显示的样本涵盖了这一点。

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

感谢@BryanD!

于 2013-02-07T16:40:24.667 回答