我有一个非常大的高分辨率地图,我想在一个应用程序中使用(图像大小约为80 MB)。
我想知道以下内容:
JProgressBar
向用户显示此模式。这应该反映已加载的字节数或类似的数字。是否有任何可以提供此功能的图像加载方法(如ImageIO.read()
)?BufferedImage
标准方式对于这么大的文件需要花费很长时间。有没有有效的方法呢?感谢您的投入!
亲切的问候,P.S。图像将在JPanel的画布上绘制。
我做的是以下几点;使用imagemagick我创建了不同分辨率的多个图像,并且在执行开始时我只加载最小的res。图片。其余部分以单独的线程加载,因此执行不会停止。使用您提供给我的信息,然后在放大或缩小时使用适当的图像。我对使用瓷砖有点怀疑,因为我需要在地图上绘制我自己的图像,而且我无法在你告诉我使用的外部jar中找到绘图功能,所以我最终使用了一些简单的东西;当缩放或平移时,重新缩放模式设置为快速,当您不进行缩放或平移时,重新缩放设置为平滑的像素完美图像(就像您建议的那样),但结果证明速度足够快我不喜欢需要瓷砖(尽管我看到更大的图像,这将是必要的,我理解你给我的信息)。
再次感谢,一切都完美无缺:)
答案 0 :(得分:2)
您应该(同时)采取两种方法:
(提供适当大小和平铺图像的缓存是允许GoogleEarth和无数其他地图应用程序渲染如此之快,然后以极高的分辨率放大地图)
获得瓷砖后,可以使用Java中的几种引擎之一:
也可能有其他人。
您可以在此框架内实现任意缩放(适用于缩放或类似缩放)。在您允许的缩放限制内,您的算法将类似于:
有几点需要注意:
使用这些技术时,图像的加载速度要快得多,因此进度条不那么重要。如果是,则需要在ImageReader上注册IIOReadProgressListener:
来自JavaDoc:
ImageReader实现用于通知调用者其图像和缩略图读取进度方法的接口。
此接口接收解码进度的一般指示(通过imageProgress和thumbnailProgress方法),以及指示整个图像何时更新的事件(通过imageStarted,imageComplete,thumbnailStarted和thumbnailComplete方法)。希望在发生像素更新时(例如,在逐行解码期间)获得通知的应用程序应提供IIOReadUpdateListener。