我们在程序开发的时候经常用到Symbol,有时还需要预览他们的样式。这时,我们需要获取其预览图片,然后放到PictureBox等容器中。所以重点是怎样获取他们的预览图片。
这里提供了两种方法。
第一种方法
使用 IStyleGalleryClass 接口
IStyleGalleryClass拥有一个Preview方法,该方法可以将Symbol的预览写入到图像中,同时提供一个范围参数。
下面提供一段参考代码:
public static Image GetImageFromSymbol(ISymbol pSymbol, int width, int height) { IStyleGalleryClass styleGalleryClass = null; if (pSymbol is IMarkerSymbol) { styleGalleryClass = new MarkerSymbolStyleGalleryClass(); } else if (pSymbol is ILineSymbol) { styleGalleryClass = new LineSymbolStyleGalleryClass(); } else if (pSymbol is IFillSymbol) { styleGalleryClass = new FillSymbolStyleGalleryClassClass(); } if (styleGalleryClass != null) { return GetImage(styleGalleryClass, pSymbol, width, height); } return null; } private static Image GetImage(IStyleGalleryClass styleGalleryClass, ISymbol symbol, int width, int height) { Image img = new Bitmap(width, height); Graphics gc = Graphics.FromImage(img); IntPtr hdc = gc.GetHdc(); var rect = new tagRECT(); rect.left = 0; rect.top = 0; rect.right = width; rect.bottom = height; styleGalleryClass.Preview(symbol, hdc.ToInt32(), ref rect); gc.ReleaseHdc(hdc); gc.Dispose(); return img; }
这种方法对于大多数的预览图片都能获取,而且速度也非常快。
当我们的需求更复杂时,比如当我想得到一条折线的预览,这种方法就不能满足我的要求了。要达到目的,我们可以采用下面一种方法。
第二种方法
使用 ISymbol 接口
ISymbol拥有一个Draw方法。通过ISymbol的SetupDC方法,设置转换属性ITransformation后,调用Draw方法,可以得到预览图片。
下面提供一段参考代码:
/// <summary> /// 获取Symbol的bitmap预览图片。 /// 具有自定义的范围或路径样式。 /// </summary> /// <returns></returns> private static Bitmap PreviewItem(ISymbol symbol, int width, int height) { var bitmap = new Bitmap(width, height); Graphics graphics = Graphics.FromImage(bitmap); double dpi = graphics.DpiY; IEnvelope envelope = new EnvelopeClass(); envelope.PutCoords(0, 0, bitmap.Width, bitmap.Height); IGeometry geometry = GetSymbolGeometry(symbol, envelope); var myRect = new tagRECT(); myRect.bottom = bitmap.Height; myRect.left = 0; myRect.right = bitmap.Width; myRect.top = 0; IDisplayTransformation displayTransformation = new DisplayTransformationClass(); displayTransformation.VisibleBounds = envelope; displayTransformation.Bounds = envelope; displayTransformation.set_DeviceFrame(ref myRect); displayTransformation.Resolution = dpi; IntPtr hdc = graphics.GetHdc(); symbol.SetupDC(hdc.ToInt32(), displayTransformation); symbol.Draw(geometry); symbol.ResetDC(); graphics.ReleaseHdc(hdc); graphics.Dispose(); return bitmap; } private static IGeometry GetSymbolGeometry(ISymbol symbol, IEnvelope envelop) { IGeometry geometry = null; if (symbol is IMarkerSymbol) { var area = (IArea) envelop; geometry = area.Centroid; } else if (symbol is ILineSymbol) { IPolyline polyline = new PolylineClass(); var pointCollection = (IPointCollection) polyline; IPoint point = new PointClass(); object before = Type.Missing; object after = Type.Missing; // 自定义一条具有三段的折线 point.PutCoords(envelop.XMin, envelop.YMax); pointCollection.AddPoint(point, ref before, ref after); point.PutCoords((envelop.XMax - envelop.XMin)/3, envelop.YMin); pointCollection.AddPoint(point, ref before, ref after); point.PutCoords((envelop.XMax - envelop.XMin) * 2 / 3, envelop.YMax); pointCollection.AddPoint(point, ref before, ref after); point.PutCoords((envelop.XMax - envelop.XMin), envelop.YMin); pointCollection.AddPoint(point, ref before, ref after); geometry = polyline; } else if (symbol is IFillSymbol) { geometry = envelop; } else if (symbol is ITextSymbol) { var area = (IArea) envelop; geometry = area.Centroid; } return geometry; }
代码中 GetSymbolGeometry 方法是设定绘制的位置、范围、或路径。这种方式比较灵活。
第二种方法相较于第一种方法在效率上没有那么高,但第二种方法可用于获取少量有必要特殊样式预览的图片的情况。所以在产生大量默认样式的预览图片是尽量采用第一种方法,需要特定的样式输出时使用第二种方法。
欢迎转载,转载请注明来源:http://blog.csdn.net/zy332719794/article/details/9951573