在arcengine中实现图片预览

来源:互联网 发布:证大财富淘宝贷容易吗 编辑:程序博客网 时间:2024/06/01 09:44

我们在程序开发的时候经常用到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://www.xuebuyuan.com/664583.html

0 0