Как я могу сделать растровое изображение из MapXtreme Styles - PullRequest
2 голосов
/ 25 марта 2009

Я разместил этот вопрос на форуме MapXtreme, но поскольку никто там никогда не отвечает на вопросы, я надеюсь, что кто-то здесь имеет некоторый опыт работы с этим продуктом (mapxtreme - это ГИС SDK, созданный людьми, которые создают MapInfo)

Я работаю над приложением 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;
    }

1010 * ТИА *

Ответы [ 2 ]

0 голосов
/ 18 ноября 2009

Первый код уже почти сработал. Я просто немного подправил, чтобы это исправить. Я проверил его на составной стиль, который содержит простой стиль vectorpoints.

    /// <summary>
    /// Creates an icon for the specified style.
    /// </summary>
    /// <param name="style">The style.</param>
    /// <returns></returns>
    private static Bitmap CreateStyleIcon(Style style)
    {
        const int iconSize = 16; //the size of the icon
        System.Drawing.Rectangle iconArea = new System.Drawing.Rectangle(0, 0, iconSize, iconSize); //a rectangle area for the icon
        StyleSample ss = new StyleSample { Bounds = iconArea };
        if (style is CompositeStyle)
        {
            CompositeStyle compsiteStyle = style as CompositeStyle;
            if (compsiteStyle.AreaStyle != null) //do we have an area style?
            {
                ss.ApplyAreaStyle(compsiteStyle.AreaStyle);
            }
            if (compsiteStyle.LineStyle != null) //do we have an LineStyle style?
            {
                ss.ApplyLineStyle(compsiteStyle.LineStyle);
            }
            if (compsiteStyle.SymbolStyle != null) //do we have an SymbolStyle style?
            {
                ss.ApplySymbol(compsiteStyle.SymbolStyle);
            }
        }
        if (style is AreaStyle)
        {
            ss.ApplyAreaStyle((AreaStyle)style);
        }
        if (style is BaseLineStyle)
        {
            ss.ApplyLineStyle((BaseLineStyle)style);
        }

        //draw the bitmap
        Bitmap iconBitmap = new Bitmap(iconSize, iconSize, System.Drawing.Imaging.PixelFormat.Format32bppArgb);//the bitmap to draw the icon to
        ss.DrawToBitmap(iconBitmap, iconArea);
        return iconBitmap;
    }
0 голосов
/ 16 апреля 2009

Дождавшись ответа - и попробовав множество других способов - все безрезультатно, я решил сделать все это «вручную», т.е. я просто смотрю на объект стиля, получаю его цвет и рисую растровое изображение, подходящее для тип слоя (линия или многоугольник).

Он не обрабатывает все случаи, а также не обрабатывает стили линий и цвета интерьера, но на данный момент он служит моим целям.

вот код, который это делает.

    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;
    }
...