Как я могу сделать растровое изображение из MapXtreme Styles
Я разместил этот вопрос на форуме 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;
}
ТИА
2 ответа
Дождавшись ответа - и попробовав множество других способов - все безрезультатно, я решил сделать все это "вручную", то есть я просто смотрю на объект стиля, получаю его цвет и рисую растровое изображение, соответствующее типу слоя (линия или многоугольник).
Он не обрабатывает каждый случай, а также не обрабатывает стили линий или цвета интерьера, но на данный момент он служит моим целям.
Вот код, который делает это.
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;
}
Первый код уже почти сработал. Я просто немного подправил, чтобы это исправить. Я проверил его на составной стиль, который содержит простой стиль 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;
}