加载多个大图像时如何使用内存映射文件

时间:2015-05-21 20:25:51

标签: c# memory-mapped-files

我有许多美国的地理参考图像,采用png和tiff格式。我想要使​​用大约12个。每幅图像约为60mb,分辨率约为18000 * 12000像素。我正在尝试创建一个Windows窗体应用程序,加载所有图像以创建一个地图。 (查看下面的链接 - 顶部图片)。该程序还具有缩放/平移功能。我已经尝试加载大约4个图像,应用程序变得非常慢,甚至崩溃了很多次。所以我想知道我是否可以使用内存映射文件(或任何其他方式)。我想要做的只是加载可见图像的一部分而不是所有图像。缩放或平移时,只应加载可见的地图部分。我想为此使用内存映射文件,但不知道从哪里开始。

What I am trying to create

2 个答案:

答案 0 :(得分:0)

我们在短信中的谈话有点长,所以我会把它转到答案。

不要使用内存映射文件,请使用平铺地图系统。

现在我只想处理一个18000 * 12000的图像,但是你可以将这个逻辑扩展到你拥有的多个图像。你要做的是你需要将它分解成更小的低分辨率块,以便在给定时间向用户显示。

所以说你有3个缩放级别100%,66%和33%。 100%将是原生分辨率。

因此,对于100%,我们将图像分解为较小的250x250px图像,因此现在您有3,456个小的250x250图像(48个图像,48个图像向下)。

对于66%,您可以使用不同的源图像来表示“缩放级别”(例如,您可能不会在地图上显示较小的道路),或者可以减小原始图像的大小。让我们说你减少了图像,你使用绘图程序将源图像的分辨率降低到12000x8000,我们再次将图像分解为更小的250x250px图像,所以现在你有1,536个小的250x250图像(48个图像是32个图像下来。)

我们再次重复此过程,将源图像的分辨率降低33%至6000x4000,我们再次将图像分解为较小的250x250px图像,因此现在您有384个小的250x250图像(24个图像,16个图像向下) )。

因此,在您的数据库中,您保留了您生成的5,376张图像(3,456 + 1,536 + 384)。假设用户的屏幕分辨率为1920x1080,您可以在内存中加载40个250x250图块(5张图像中的8张图像) )为适当的缩放级别并在屏幕上显示它们。如果您的用户平移或更改缩放级别,则会加载新的图块并让您的旧图块卸载,因此您只需在任何给定时间内将40个250x250图像保留在内存中。

答案 1 :(得分:0)

我将不得不对此发表评论。当答案进入"缩放级别"时,我立即看到一个红旗。从程序员的角度来看,这是一种懒惰的方法,可以避免处理额外的图像计算,但从用户的角度来看,如果他们想要连续的缩放范围,它就是一个非常糟糕的方法。 Google为速度和带宽做到了这一点,这对特定的应用程序来说很好。具有讽刺意味的是,我来到这个线程,因为我已经将地图分解成了瓷砖(625 1009x1009!),我想做的就是平移。当唯一的解决方案甚至没有触及原始问题时,这是一种痛苦。

修改:如果主持人看到此内容,请将其转换为评论。我不知道它是如何成为答案的。