我需要将一个巨大的图像(BufferedImage来访问颜色等)放入JScrollPane派生类中。在那之前没什么难的。
该图像是A3样品材料的JPG扫描,其尺寸为13030x20840像素,24位,并且在盘上具有12MB的重量 - >内存大约800MB。
我将BufferedImage嵌入到Jpanel中,它位于Scrollpane的视图中。
当我尝试滚动/拖动图像时,响应需要几秒钟,所以它不是很方便。
我需要你的帮助,以便了解我应该做些什么来渲染滚动窗格的滚动和图像拖动尽可能平滑和反应,但我很容易弄清楚,有了这样的图像,它可能是不可能的。
我尝试了很多选项,例如双缓冲等等,但我对Swing来说还是一个新手,那么我很可能错过了一些简单的解决方案。
如果需要通过其他方式或其他方式更改BufferedImage,我可以接受任何解决方案。
答案 0 :(得分: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应用程序中较小的缓冲图像要快得多。
答案 1 :(得分:0)
我在那里找到了我需要的东西:
very large image manipulation and tiling
A nice book, the sample shown covers that.
Java JAI lib具有许多处理这类问题的功能,并得到Oracle的支持,这意味着它(理论上)稳定且可持续。
感谢@BryanD!