繁体   English   中英

JScrollPane中的java巨大BufferedImage

[英]java huge BufferedImage in JScrollPane

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

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

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

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

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

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

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

因此,我们有一个 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 应用程序中较小的缓冲图像的大小要快得多。

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

非常大的图像处理和平铺

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

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

感谢@BryanD!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM