Skip to main content
 首页 » 编程设计

c#之如何从 MapXtreme 样式制作位图

2024年01月13日31shanyou

我已经在 MapXtreme 论坛上发布了这个问题,但是因为从来没有人在那里回答问题,我希望这里的人对这个产品有一些经验(mapxtreme 是由制作 MapInfo 的人制作的 GIS SDK)

我正在开发 MapXtreme Desktop 应用程序,我们需要要素样式的位图

我尝试了两种方法,但我得到的只是一个带有深色 X 的灰色位图。

这是我用过的代码,两种方式都在代码中,但有一种被注释掉了:

    public static Bitmap GetStyleBitmap(Style style) 
    { 
        var bm = new Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
        var rect = new System.Drawing.Rectangle(0, 0, 16, 16); 
        var ss = new StyleSample(); 
        ss.Bounds = rect; 
        if (style is CompositeStyle) 
        { 
            ss.ApplyAreaStyle(((CompositeStyle)style).AreaStyle); 
            ss.ApplyLineStyle(((CompositeStyle)style).LineStyle); 
        } 
        if (style is AreaStyle) 
        { 
            ss.ApplyAreaStyle((AreaStyle)style); 
        } 
        if (style is SimpleLineStyle) 
        { 
            ss.ApplyLineStyle((SimpleLineStyle)style); 
        } 
 
        //using MapExport 
        var me = new MapExport(ss.Map); 
        var image = me.Export(); 
        return new Bitmap(image); 
 
        //using StyleSample.DrawToBitmap 
        //ss.DrawToBitmap(bm, rect); 
        //return bm; 
    } 

TIA

请您参考如下方法:

在等待答案 - 并尝试了无数其他方法 - 都无济于事之后,我决定全部“手工”完成,即我只是查看样式对象获取它的颜色并绘制一个适合的位图图层类型(线或多边形)。

它不会处理所有情况,也不处理线条样式或内部颜色,但它现在可以满足我的目的。

这是执行此操作的代码。

    public static Bitmap GetStyleBitmap(FeatureLayer fl) 
    { 
        Feature f = GetFirstFeature(fl); 
        if (f == null) return null; 
 
        var style = f.Style; 
        Color c; 
        var bm = new Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
        PointF[] poly = new PointF[]  
        { 
            new PointF(2,5), 
            new PointF(5,2), 
            new PointF(14,7), 
            new PointF(14,14), 
            new PointF(2,14), 
            new PointF(2,4) 
        }; 
 
        SimpleLineStyle line = null; 
        if (style is CompositeStyle) 
            line = ((CompositeStyle)style).AreaStyle.Border as SimpleLineStyle; 
        if (style is AreaStyle) 
            line = ((AreaStyle)style).Border as SimpleLineStyle; 
 
        if (line != null) 
        { 
            c = line.Color; 
 
            using (var gr = Graphics.FromImage(bm)) 
            { 
                gr.DrawPolygon(new Pen(c, 2), poly); 
            } 
            return bm; 
        } 
 
        line = style as SimpleLineStyle; 
 
        if (line != null) 
        { 
            c = line.Color; 
 
            using (var gr = Graphics.FromImage(bm)) 
            { 
                gr.DrawLine(new Pen(c, 2), new PointF(2,2), new PointF(14,14)); 
            } 
        } 
        return bm; 
    }