在arcengine中实现图片预览
我们在程序开发的时候经常用到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中实现图片预览相关推荐
- uniapp 对富文本中的图片预览及长按图片识别二维码/保存图片
uniapp 对富文本中的图片预览及长按图片识别二维码/保存图片 富文本一定要使用uniapp提供的<rich-text>标签,不要使用 v-html 因为<rich-text> ...
- elementUi中的图片预览功能(图片放大、缩小)preview-src-list属性
一.图片有时候需要放大预览,放大后可支持放大缩小等功能,element中的preview-src-list属性可以实现. 二.主要代码: <el-form ref="verificat ...
- vue中实现图片预览放大,缩小,旋转等功能, 使用viewerjs
前言: 之前使用过v-viewer实现图片查看的功能,但是不知道今年怎么回事,node线上的包下载下来不能用了,实现不了效果,又找到了一另一个好用的插件,那就是viewjs. 实现效果: 实现步骤: ...
- .md文件中插入本地图片并显示图片预览
文章目录 前言 一.图片文件上传到gitee图片仓库 1:获取图片网址 (1).注册gitee,建立gitee图片仓库 (2)上传图片至gitee图片仓库 2.修改图片网址,插入到md文件中并预览 ( ...
- layui数据表格中展示图片及图片预览
在项目中遇到数据表格中放入图片同时可以点击放大预览.预览方式我才用的是layer方式.代码如下: layui.use('table', function(){var table = layui.tab ...
- layui列表显示缩略图_layui 表格中实现照片预览,点击查看原图
人员表格中实现照片预览,并且可点击放大.查看原图 js //定义列 var cols = [ [{ type: 'radio', width: 60 }, { type: 'numbers', wid ...
- ImagePreview 图片预览 的使用
一.ImagePreview 图片预览 的使用 ImagePreview 是一个函数(必须使用按需到处),调用函数后会直接在页面中展示图片预览界面. // 实现图片预览 import { ImageP ...
- Angular 图片预览组件
写在前面 环境 :Angular8 图片预览组件实现的功能包括:全屏查看:放大.缩小( 鼠标滚轮可放大.缩小图片):翻页( 键盘左右按键翻页):旋转:拖拽 功能实现 首先创建angular项目,在项目 ...
- angular中封装fancyBox(图片预览)
首先在官网下载最新版的fancyBox(一定要去最新网站,以前依赖的jquery版本偏低),附上链接:http://fancyapps.com/fancybox/3/ 然后在项目中引用jquery,然 ...
最新文章
- Dojo学习13 dijit.Tree 动态添加节点之一
- python中ifelifelse用在什么结构_详解Python if-elif-else知识点
- 服务器线程数一直增加,.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长...
- Sentinel(五)之流量控制
- java 静态方法的使用_java的静态方法的使用
- MongoDB 和 mySql 的关系
- mysql的关系表_MySQL表关系总结
- 20个值得研究的vue项目
- 微正MZFinger指纹识别算法
- 局域网内查询嵌入式设备IP的几种方式
- Delaunay 三角剖分2D(原理 + 源码)
- 机器学习中SVM的损失函数,向量积
- iOS11 API 更新整理
- 完成GitHub上squirrel 的运行(数据库的模糊测试)
- 机器学习入门的书单(数据挖掘、模式识别等一样)转
- HarmonyOS——一个面向物联网的操作系统
- 《学习之道》 读书记录
- php玩偶,玩偶娃衣 织法教程|毛衣花样图解|视频教程-编织人生
- 网易云音乐小程序,带后台(SpringBoot)
- 输入年份,然后打印出该年的万年历,以及标识出当天日期。类似于linux下的cal -y结果。