ArcEngine中实现Symbol的预览

简介: 版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/9951573   我们在程序开发的时候经常用到Symbol,有时还需要预览他们的样式。
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/9951573

  我们在程序开发的时候经常用到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






相关文章
|
数据安全/隐私保护 计算机视觉
qss样式表笔记大全(三):可设置样式的窗口部件列表(中)(持续更新示例) 一
qss样式表笔记大全(三):可设置样式的窗口部件列表(中)(持续更新示例)
qss样式表笔记大全(三):可设置样式的窗口部件列表(中)(持续更新示例) 一
|
前端开发 JavaScript
引用阿里图标库的三种方式——多色图标我选symbol
引用阿里图标库的三种方式——多色图标我选symbol
425 0
基于C#的ArcEngine二次开发31:addin开发时调用ArcMap的进度条
基于C#的ArcEngine二次开发31:addin开发时调用ArcMap的进度条
基于C#的ArcEngine二次开发31:addin开发时调用ArcMap的进度条
|
定位技术 C# 图形学
基于C#的ArcEngine二次开发53: mxd与IPagelayout
基于C#的ArcEngine二次开发53: mxd与IPagelayout
|
计算机视觉
qss样式表笔记大全(四):可设置样式的窗口部件列表(下)(持续更新示例)一
qss样式表笔记大全(四):可设置样式的窗口部件列表(下)(持续更新示例)
qss样式表笔记大全(四):可设置样式的窗口部件列表(下)(持续更新示例)一
qss样式表笔记大全(四):可设置样式的窗口部件列表(下)(持续更新示例)二
qss样式表笔记大全(四):可设置样式的窗口部件列表(下)(持续更新示例)
qss样式表笔记大全(四):可设置样式的窗口部件列表(下)(持续更新示例)二
|
计算机视觉
qss样式表笔记大全(二):可设置样式的窗口部件列表(上)(持续更新示例)
qss样式表笔记大全(二):可设置样式的窗口部件列表(上)(持续更新示例)
qss样式表笔记大全(二):可设置样式的窗口部件列表(上)(持续更新示例)
qss样式表笔记大全(三):可设置样式的窗口部件列表(中)(持续更新示例)二
qss样式表笔记大全(三):可设置样式的窗口部件列表(中)(持续更新示例)
qss样式表笔记大全(三):可设置样式的窗口部件列表(中)(持续更新示例)二
|
定位技术
ArcEngine 样式对象StyleGallery的使用详解
        ArcMap里面存在很多预定义的样式对象,比如颜色、图例和各种符号等。用户也可以新建自己的样式对象,来满足实际开发的特殊需要。在进行arcgis engine 二次开发的过程中,用户可直接使用这些样式对象,以丰富制图内容,简化制图过程。
1899 0
|
容器 iOS开发
Expression Blend4经验分享:制作一个简单的图片按钮样式
原文:Expression Blend4经验分享:制作一个简单的图片按钮样式 这次分享如何做一个简单的图片按钮经验 在我的个人Silverlight网页上,有个Iphone手机的效果,其中用到大量的图片按钮 http://raimon.
984 0