大尺寸图像会导致OufOfMemoryException

时间:2011-06-16 12:18:18

标签: out-of-memory openmap

我正在使用OpenMap并且必须加载非常大的尺寸图像 我试图将这些图像加载为大型栅格,并因OufOfMemoryException而失败。在调试模式下,图层构造函数告诉我图像尺寸太大。

在OpenMap邮件列表中,我找到了MyJAIPlugin,它允许我加载和显示GeoTiff文件。

如何在OpenMap中显示300mb GeoTiff?

1 个答案:

答案 0 :(得分:2)

通过加载至少690mb文件大小的高清地图,我的情况几乎相同。

我还使用了邮件列表中的JAIPlugIn,并且他们使用OMScalingRaster与BufferedImage一起使用。这些限制了您的图像大小并导致调试消息。

我通过修改OMScalingRaster解决了这个问题。我已将BufferedImage更改为TiledImage以处理大图像并修复即将发生的错误。这里重要的是你要改变scaleTo(Projection thisProj)方法,用JAI进行缩放。

现在我可以加载文件并将其渲染到地图上。但是如果你缩小太多,它会抛出一个OutOfMemoryException,因为在我的修改中,我会创建一个可见的图像部分的子图像,并将其作为BufferedImage提供给OMRaster。

这是mod。在scaleTo-method的末尾:

            // Now we can grab the bit we want out of the source
            // and
            // scale it to fit the intersection.

            // Calc width adjustment
            float widthAdj = (float) ((double) iRect.width
                    / (double) clipRect.width);
            // Calc height adjustment
            float heightAdj = (float) ((double) iRect.height
                    / (double) clipRect.height);

            // Create the transform
            // JAI-Version
            ParameterBlock pb = new ParameterBlock();
            pb.addSource(sourceImage.getSubImage(clipRect.x,
                    clipRect.y,
                    clipRect.width,
                    clipRect.height).getAsBufferedImage());
            pb.add(widthAdj);          // The xScale
            pb.add(heightAdj);          // The yScale
            pb.add(0.0F);           // The x translation
            pb.add(0.0F);           // The y translation
            RenderedOp newImage = JAI.create("scale",pb, null);

            bitmap = newImage.getAsBufferedImage();


            point1.setLocation(iRect.x, iRect.y);
            // setVisible(currentVisibility);
        }
    } else {
        bitmap = null;
    }
}

对于使用TiledImage替换BufferedImage的其他错误,请使用等效的TiledImage方法。但是为了节省内存,你应该使用TiledImage构造函数和sharedDataBuffer flag = true。

例如这个mod。可以处理地图(压缩690mb),缩放比例为1:50000,在图层显示内存不足之前,我可以缩小到1:600000。