JScrollPane中的java巨型缓冲区映像

JScrollPane中的java巨型缓冲区映像,java,image,jpanel,jscrollpane,bufferedimage,Java,Image,Jpanel,Jscrollpane,Bufferedimage,我需要将一个巨大的图像(BuffereImage以访问颜色等)放入JScrollPane派生的类中。在那之前没什么难事 该图像是一幅A3材质样本的JPG扫描,其大小为13030x20840像素,24位,在磁盘上的重量为12MB->在RAM中的大小约为800MB 我将BuffereImage嵌入到Jpanel中,它作为滚动窗格的视图 当我尝试滚动/拖动图像时,需要几秒钟才能做出响应,所以这不是很方便 我需要你的帮助,以便知道我应该做什么,使滚动窗格的滚动和图像拖动尽可能平滑和反应,但我很容易发现,

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

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

我将BuffereImage嵌入到Jpanel中,它作为滚动窗格的视图

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

我需要你的帮助,以便知道我应该做什么,使滚动窗格的滚动和图像拖动尽可能平滑和反应,但我很容易发现,有这样一个图像,它可能是不可能的

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


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

因此,我们有一个13030 x 20840像素的大图像

如果我们把这个图像分成256 x 256像素的分片,我们得到的分片集是51个分片和82个分片。行和列中的最后一个平铺将是部分图像,因为256不会均匀地进入13030和20840

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

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

现在,当我们在JScrollPane上设置水平和垂直滚动时,我们必须将水平滚动的最大值设置为13030,将垂直滚动的最大值设置为20840。这使得用户能够动态地意识到他正在滚动一个大图像

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

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

mKorbel已经创建了一些用于动态构建和显示这些较小的缓冲图像的软件


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

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

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


感谢@BryanD

解压到图像缓冲区后的图像大小约为750MB,而不是12MB。@Jim Garrisson:没错,我重写了它。感谢您关注此细节。请将您的图像拆分为平铺。256像素x 256像素分幅是常见的。仅显示适合滚动窗格的平铺。当滚动窗格滑块移动时,显示不同的分幅。我在以前的尝试中已经这样做了,但它使用的是不同的编程语言。我真的不知道如何在scrollpane->layout中放置磁贴?您可以从磁贴中构建一个缓冲图像,并像现在一样显示缓冲图像。唯一的技巧是在用户滚动时构建一个新的缓冲图像,并在滚动窗格中正确定位新的缓冲图像。耶!谢谢你的链接,我没有找到它->我的浏览器没有hilite它(在你之前的评论中),因为一些模糊的原因。。。非常感谢你和mKorbel!mKorbel的伟大解决方案实现了[[,感谢你和他!我将他的解决方案与一系列WeakReference相结合,以存储单个瓷砖,而无需硬mermory持久性。一切正常。请看:,非常有趣。