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

在arcengine中实现图片预览相关推荐

  1. uniapp 对富文本中的图片预览及长按图片识别二维码/保存图片

    uniapp 对富文本中的图片预览及长按图片识别二维码/保存图片 富文本一定要使用uniapp提供的<rich-text>标签,不要使用 v-html 因为<rich-text> ...

  2. elementUi中的图片预览功能(图片放大、缩小)preview-src-list属性

    一.图片有时候需要放大预览,放大后可支持放大缩小等功能,element中的preview-src-list属性可以实现. 二.主要代码: <el-form ref="verificat ...

  3. vue中实现图片预览放大,缩小,旋转等功能, 使用viewerjs

    前言: 之前使用过v-viewer实现图片查看的功能,但是不知道今年怎么回事,node线上的包下载下来不能用了,实现不了效果,又找到了一另一个好用的插件,那就是viewjs. 实现效果: 实现步骤: ...

  4. .md文件中插入本地图片并显示图片预览

    文章目录 前言 一.图片文件上传到gitee图片仓库 1:获取图片网址 (1).注册gitee,建立gitee图片仓库 (2)上传图片至gitee图片仓库 2.修改图片网址,插入到md文件中并预览 ( ...

  5. layui数据表格中展示图片及图片预览

    在项目中遇到数据表格中放入图片同时可以点击放大预览.预览方式我才用的是layer方式.代码如下: layui.use('table', function(){var table = layui.tab ...

  6. layui列表显示缩略图_layui 表格中实现照片预览,点击查看原图

    人员表格中实现照片预览,并且可点击放大.查看原图 js //定义列 var cols = [ [{ type: 'radio', width: 60 }, { type: 'numbers', wid ...

  7. ImagePreview 图片预览 的使用​

    一.ImagePreview 图片预览 的使用 ImagePreview 是一个函数(必须使用按需到处),调用函数后会直接在页面中展示图片预览界面. // 实现图片预览 import { ImageP ...

  8. Angular 图片预览组件

    写在前面 环境 :Angular8 图片预览组件实现的功能包括:全屏查看:放大.缩小( 鼠标滚轮可放大.缩小图片):翻页( 键盘左右按键翻页):旋转:拖拽 功能实现 首先创建angular项目,在项目 ...

  9. angular中封装fancyBox(图片预览)

    首先在官网下载最新版的fancyBox(一定要去最新网站,以前依赖的jquery版本偏低),附上链接:http://fancyapps.com/fancybox/3/ 然后在项目中引用jquery,然 ...

最新文章

  1. Dojo学习13 dijit.Tree 动态添加节点之一
  2. python中ifelifelse用在什么结构_详解Python if-elif-else知识点
  3. 服务器线程数一直增加,.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长...
  4. Sentinel(五)之流量控制
  5. java 静态方法的使用_java的静态方法的使用
  6. MongoDB 和 mySql 的关系
  7. mysql的关系表_MySQL表关系总结
  8. 20个值得研究的vue项目
  9. 微正MZFinger指纹识别算法
  10. 局域网内查询嵌入式设备IP的几种方式
  11. Delaunay 三角剖分2D(原理 + 源码)
  12. 机器学习中SVM的损失函数,向量积
  13. iOS11 API 更新整理
  14. 完成GitHub上squirrel 的运行(数据库的模糊测试)
  15. 机器学习入门的书单(数据挖掘、模式识别等一样)转
  16. HarmonyOS——一个面向物联网的操作系统
  17. 《学习之道》 读书记录
  18. php玩偶,玩偶娃衣 织法教程|毛衣花样图解|视频教程-编织人生
  19. 网易云音乐小程序,带后台(SpringBoot)
  20. 输入年份,然后打印出该年的万年历,以及标识出当天日期。类似于linux下的cal -y结果。

热门文章

  1. phabricator 结合 arcanist 使用
  2. JPress安装体验
  3. Cartesian convention笛卡尔公约
  4. 完整部署uniswap 合约、前端教程(可部署uniswap到bsc、heco)
  5. AsyncHttpClient 请求
  6. 浙江工商大学计算机技术专硕,浙江工商大学会计专硕(MPAcc)项目介绍
  7. html剧场座位设计图,如何设计剧院座位,21个细部案例 | ArchDaily
  8. libusb-win32的使用教程和例子
  9. 标准员培训建筑八大员培训建筑标准员建筑工程施工标准化管理
  10. 同步,异步,直流电机原理