我正在构建一个地图系统,需要一个大图像(原生13K像素宽,20K像素高)覆盖到美国大约20公里左右的区域。我将jpg格式的图像文件大小降至23 MB,并且可以相当快地加载到地图上。我可以放大和缩小它看起来很棒。它甚至位于我需要的地方(地理位置)。但是,这个25 MB的文件导致Firefox消耗额外的1GB内存!我在Firefox上使用Memory Restart扩展,没有图像叠加,内存使用量大约是360 MB到400 MB,这似乎是常规使用,浏览其他网站等的标准。但是当我添加图像层时,内存使用量跃升至1.4 GB。我完全不知道为什么会这样,以及如何解决它。任何想法都将不胜感激。
安德鲁
答案 0 :(得分:1)
该文件仅占用23 MB作为JPEG。但是,JPEG格式是压缩的,任何想要实际渲染图像的程序(如FireFox)都必须将其解压缩并将每个像素存储在内存中。你有13k×20k像素,这使得260M像素。每个像素至少3个字节的颜色信息,即780 MB。它可能使用4个字节,使每个像素在字边界处对齐,这将是1040 MB。
关于如何解决它,好吧,我不知道你能否,除了缩小图像大小。如果图像只包含少量颜色(例如,以几种原色绘制的简单图表),您可以将其保存为使用索引颜色的某种格式,然后FireFox 可能能够使用每像素更少的内存来渲染它。这一切都取决于渲染代码。
根据您正在做的事情,也许您可以进行设置以使整个图像的分辨率更低,然后当用户放大时,它们会获得覆盖面积更小的更高分辨率的图像。
编辑:澄清最后一点:现在你以完整分辨率拍摄整张照片,这很简单,但需要大量内存。另一种方法是使整张照片的分辨率降低(最大预期屏幕分辨率),这将占用更少的内存;然后,当用户放大时,您的图像处于全分辨率,而不是整个图像 - 只是放大的部分(同样需要更少的内存)。
我可以想到两种方法:将大图像分解为“图块”并加载您需要的图像(不确定效果如何),或使用像ImageMagick这样的东西来构建较小的图像。如果你这样做,你可能想要使用缓存,并且你可能需要在构建时编写一些“请稍候”的消息来显示,因为它可能需要几秒钟才能处理这么大的图像。 / p>