`
evget
  • 浏览: 144792 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类

将symbologycontrol中选中的symbol或对象转化为图像

 
阅读更多
当我们用Symbologycontrol设置某个图层symbol的样式或设置指北针、比例尺的样式时,我们需要将这些选中的样式以图片的形式显示在例如PictureBox中,这时我们就需要得到选中对象的Image,下面是我提供的两种方法:

一:是利用AE自带的PreviewItem方法来实现,这种方法普适性好,能适用所有Symbolgycontrol支持的对象

二:是利用Symbol的Draw函数实现,该方法目前只支持Symbol,可以进行扩充

方法一:

''' <summary>
  ''' 通过SymbolObject获得image
  ''' </summary>
  ''' <param name="pStyleGallery">传入的Symbologycontrol中选中的项</param>
  ''' <param name="pStyleClass">当前类型</param>
  ''' <param name="pWidth">图像宽度</param>
  ''' <param name="pHeight">图像高度</param>
  ''' <returns>得到的Image</returns>
  ''' <remarks></remarks>
  Shared Function GetImageFromSymbolObject(ByVal pStyleGallery As IStyleGalleryItem, ByVal pStyleClass As esriSymbologyStyleClass, ByVal pWidth As Double, ByVal pHeight As Double) As Image
    Dim pSymbology As ISymbologyControl = New SymbologyControl
    pSymbology.StyleClass = pStyleClass
    pSymbology.GetStyleClass(pSymbology.StyleClass).AddItem(pStyleGallery, 0)
    Dim picture As stdole.IPictureDisp = pSymbology.GetStyleClass(pSymbology.StyleClass).PreviewItem(pStyleGallery, pWidth, pHeight)
    Dim image As System.Drawing.Image = System.Drawing.Image.FromHbitmap(New System.IntPtr(picture.Handle))
    Return image
  End Function
  ''' <summary>
  ''' 通过SymbolObject获得image
  ''' </summary>
  ''' <param name="pSymbology">传入的symbologycontrol</param>
  ''' <param name="pStyleGallery">传入的Symbologycontrol中选中的项</param>
  ''' <param name="pWidth">图像宽度</param>
  ''' <param name="pHeight">图像高度</param>
  ''' <returns>得到的Image</returns>
  ''' <remarks></remarks>
  Shared Function GetImageFromSymbolObject(ByVal pSymbology As ISymbologyControl, ByVal pStyleGallery As IStyleGalleryItem, ByVal pWidth As Double, ByVal pHeight As Double) As Image
    Dim picture As stdole.IPictureDisp = pSymbology.GetStyleClass(pSymbology.StyleClass).PreviewItem(pStyleGallery, pWidth, pHeight)
    Dim image As System.Drawing.Image = System.Drawing.Image.FromHbitmap(New System.IntPtr(picture.Handle))
    Return image
  End Function
  ''' <summary>
  ''' 通过SymbolObject获得image
  ''' </summary>
  ''' <param name="pStyleClass">当前的类型</param>
  ''' <param name="pSymbolObject">传入的对象,比如TextSymbol,NorthArrow</param>
  ''' <param name="pWidth">图像宽度</param>
  ''' <param name="pHeight">图像高度</param>
  ''' <returns>得到的Image</returns>
  ''' <remarks></remarks>
  Shared Function GetImageFromSymbolObject(ByVal pStyleClass As esriSymbologyStyleClass, ByVal pSymbolObject As Object, ByVal pWidth As Double, ByVal pHeight As Double) As Image
    Dim pSymbology As ISymbologyControl = New SymbologyControl
    Dim pStyleGallery As IStyleGalleryItem = New ServerStyleGalleryItem
    pStyleGallery.Name = "当前符号"
    pStyleGallery.Item = pSymbolObject
    pSymbology.GetStyleClass(pStyleClass).AddItem(pStyleGallery, 0)
    Dim picture As stdole.IPictureDisp = pSymbology.GetStyleClass(pStyleClass).PreviewItem(pStyleGallery, pWidth, pHeight)
    Dim image As System.Drawing.Image = System.Drawing.Image.FromHbitmap(New System.IntPtr(picture.Handle))
    Return image
  End Function
  ''' <summary>
  ''' 通过SymbolObject获得image
  ''' </summary>
  ''' <param name="pSymbolObject">传入的对象,比如TextSymbol,NorthArrow</param>
  ''' <param name="pWidth">图像宽度</param>
  ''' <param name="pHeight">图像高度</param>
  ''' <returns>得到的Image</returns>
  ''' <remarks></remarks>
  Shared Function GetImageFromSymbolObject(ByVal pSymbolObject As Object, ByVal pWidth As Double, ByVal pHeight As Double) As Image
    Dim pSymbology As ISymbologyControl = New SymbologyControl
    Dim pStyleGallery As IStyleGalleryItem = New ServerStyleGalleryItem
    pStyleGallery.Name = "当前符号"
    pStyleGallery.Item = pSymbolObject
    Dim pStyleClass As esriSymbologyStyleClass = GetStyleClass(pSymbolObject)
    pSymbology.GetStyleClass(pStyleClass).AddItem(pStyleGallery, 0)
    Dim picture As stdole.IPictureDisp = pSymbology.GetStyleClass(pStyleClass).PreviewItem(pStyleGallery, pWidth, pHeight)
    Dim image As System.Drawing.Image = System.Drawing.Image.FromHbitmap(New System.IntPtr(picture.Handle))
    Return image
  End Function

  ''' <summary>
  ''' 获得当前对应的styleclass
  ''' </summary>
  ''' <param name="pSymbolObject">当前的对象</param>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Shared Function GetStyleClass(ByVal pSymbolObject As Object) As esriSymbologyStyleClass
    If TypeOf pSymbolObject Is ITextSymbol Then
      Return esriSymbologyStyleClass.esriStyleClassTextSymbols
    ElseIf TypeOf pSymbolObject Is IMarkerSymbol Then
      Return esriSymbologyStyleClass.esriStyleClassMarkerSymbols
    ElseIf TypeOf pSymbolObject Is ILineSymbol Then
      Return esriSymbologyStyleClass.esriStyleClassLineSymbols
    ElseIf TypeOf pSymbolObject Is IFillSymbol Then
      Return esriSymbologyStyleClass.esriStyleClassFillSymbols
    ElseIf TypeOf pSymbolObject Is IScaleText Then
      Return esriSymbologyStyleClass.esriStyleClassScaleTexts
    ElseIf TypeOf pSymbolObject Is IScaleBar Then
      Return esriSymbologyStyleClass.esriStyleClassScaleBars
    ElseIf TypeOf pSymbolObject Is INorthArrow Then
      Return esriSymbologyStyleClass.esriStyleClassNorthArrows
    ElseIf TypeOf pSymbolObject Is IBackground Then
      Return esriSymbologyStyleClass.esriStyleClassBackgrounds
    ElseIf TypeOf pSymbolObject Is IBorder Then
      Return esriSymbologyStyleClass.esriStyleClassBorders
    ElseIf TypeOf pSymbolObject Is IShadow Then
      Return esriSymbologyStyleClass.esriStyleClassLabels
    ElseIf TypeOf pSymbolObject Is ILegend Then
      Return esriSymbologyStyleClass.esriStyleClassLegendItems
    End If
  End Function



方法二:


  ''' <summary>
  ''' 将symbol转成bitmap
  ''' </summary>
  ''' <param name="pSymbol">symbol</param>
  ''' <param name="iwidth">图像宽</param>
  ''' <param name="iheight">图像高</param>
  ''' <returns>返回bitmap</returns>
  ''' <remarks></remarks>
  Shared Function SymbolToBitmp(ByVal pSymbol As ISymbol, ByVal iwidth As Integer, ByVal iheight As Integer) As System.Drawing.Bitmap
    ''根据高宽创建图象
    Dim bmp As Drawing.Bitmap = New Drawing.Bitmap(iwidth, iheight)
    Dim gImage As Drawing.Graphics = Drawing.Graphics.FromImage(bmp)
    gImage.Clear(Drawing.Color.White)

    Dim dpi As Double = gImage.DpiX
    Dim pEnvelope As IEnvelope = New EnvelopeClass()
    pEnvelope.PutCoords(0, 0, bmp.Width, bmp.Height)
    Dim deviceRect As New tagRECT
    deviceRect.left = 0
    deviceRect.right = bmp.Width
    deviceRect.top = 0
    deviceRect.bottom = bmp.Height
    Dim pDisplayTransformation As IDisplayTransformation = New DisplayTransformationClass
    pDisplayTransformation.VisibleBounds = pEnvelope
    pDisplayTransformation.Bounds = pEnvelope
    pDisplayTransformation.DeviceFrame = deviceRect
    pDisplayTransformation.Resolution = dpi

    Dim pGeo As IGeometry = CreateSymShape(pSymbol, pEnvelope)
    Dim hdc As System.IntPtr = New IntPtr()
    hdc = gImage.GetHdc()
    ''将符号的形状绘制到图象中
    pSymbol.SetupDC(hdc, pDisplayTransformation)
    pSymbol.Draw(pGeo)
    pSymbol.ResetDC()
    gImage.ReleaseHdc(hdc)
    gImage.Dispose()
    Return bmp
  End Function

  Shared Function CreateSymShape(ByVal pSymbol As ISymbol, ByVal pEnvelope As IEnvelope) As IGeometry

    Dim pGeo As IGeometry = Nothing
    '' 根据传入的符号以及外包矩形区域返回对应的几何空间实体(点,线、面)
    ''判断是否为“点”符号
    If TypeOf pSymbol Is IMarkerSymbol Then
      Dim pMarkerSym As IMarkerSymbol = pSymbol
      If pMarkerSym IsNot Nothing Then
        ''为“点”符号则返回IEnvelope的中心点
        Dim pArea As IArea = pEnvelope
        pGeo = pArea.Centroid
      End If
    ElseIf TypeOf pSymbol Is ILineSymbol Then
      ''判断是否为“线”符号
      Dim IlineSym As ILineSymbol = pSymbol
      If IlineSym IsNot Nothing Then
        ''返回45度的对角线
        Dim IpLine As IPolyline
        IpLine = New PolylineClass()
        IpLine.FromPoint = pEnvelope.LowerLeft
        IpLine.ToPoint = pEnvelope.UpperRight
        pGeo = IpLine
      End If
    ElseIf TypeOf pSymbol Is IFillSymbol Then
      ''直接返回一个IEnvelope矩形区域
      pGeo = pEnvelope
    End If
    Return pGeo
  End Function

原文出处:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9092
分享到:
评论

相关推荐

    遥感图像的面向对象分类

    在Process Tree窗口中,学生需要新建一个项目,打开要分类的影像,然后在Process Tree中选中for all,点击右键选择Insert Child,并重命名为segmentation。接着,学生需要在算法中选择多尺度分割,参数设置如图2所示...

    计算机软件-商业源码-实例27 托放列表框中选中的对象.zip

    在计算机编程领域,拖放(Drag and Drop)技术是一种用户界面设计模式,允许用户通过鼠标或其他输入设备将一个对象从一处“拖动”到另一处“放下”。在本实例"计算机软件-商业源码-实例27 托放列表框中选中的对象"中...

    Delphi 拖放列表框中选中的对象.rar

    在列表框中,我们可以将选中的项目设置为 TDropSource,然后让列表框本身成为 TDropTarget。 首先,我们需要在列表框的某个事件(如 OnMouseDown)中启动拖放操作。这可以通过调用 TDropSource 的 DoDragDrop 方法...

    N个数中选1个或多个,其和为N的倍数

    ### N个数中选1个或多个,其和为N的倍数 #### 背景与问题描述 本篇文章将探讨一个有趣的编程问题:如何从给定的N个整数中选择一个或多个整数,使它们的总和能够被N整除。这个问题在算法设计、数据结构学习以及编程...

    Photoshop软件智能对象图层.docx

    - **粘贴为智能对象**:在Illustrator中选中图形,复制并粘贴到Photoshop中,选择粘贴为智能对象选项。 - **转换现有图层**:选中图层,通过【图层】&gt;【智能对象】&gt;【转换为智能对象】或右键菜单将其转换。 3. **...

    电信设备-基于中位数的无损图像信息隐藏算法.zip

    无损图像信息隐藏是指在不改变图像视觉质量的前提下,将秘密信息嵌入到图像中,提取时能够完全恢复原始图像,同时获取隐藏信息。这种技术对于保障敏感数据的传输安全具有重要意义,特别是在电信领域,大量的数据交换...

    修改单元格中选中内容文本的格式.xlsm

    修改单元格中选中内容文本的格式.xlsm 设置选择文本设置为上标或下标

    ListView中选中的项高亮显示

    本文将详细介绍如何在C#的Winform环境下,实现ListView控件中选中项的高亮显示。 首先,我们要理解ListView的基本结构。ListView控件允许我们添加多个列(Columns)来展示数据,并且每个列表项(Items)都可以包含...

    js获得Gridview中选中checkbox行的信息

    本文将详细介绍如何使用JavaScript获取GridView中选中Checkbox行的信息。 首先,理解基础概念: 1. **JavaScript**:一种运行在客户端的脚本语言,常用于网页动态效果的实现和与用户的交互。 2. **GridView**:通常...

    VisualC++的MFC调用自己制作的图像处理dll

    在本文中,我们将深入探讨如何使用Visual C++的MFC(Microsoft Foundation Classes)框架来调用自定义制作的图像处理DLL。DLL(Dynamic Link Library)是一种Windows操作系统中的共享库,它封装了特定的功能,可供多...

    批量将excel中选中区域内的空白行删除

    格式为bas,可在excel开发工具中导入后,修改查看运行代码

    动态循环加载select中选中的值

    接着,它遍历数据数组,为每个对象创建一个新的`&lt;option&gt;`元素,设置其值和是否选中,最后将新选项添加到`&lt;select&gt;`元素中。 如果你的应用使用了诸如jQuery或Vue.js这样的库,那么这个过程可能会有所不同。例如,在...

    javascript的document对象

    - **document.body.background**:设置或获取`&lt;body&gt;`元素的背景图像。 - **document.body.appendChild(oTag)**:向`&lt;body&gt;`元素添加一个新的子元素。 #### Body元素的事件监听器 - **document.body.onclick="func...

    Dreamweaver CS6添加文本和图像超链接.pdf

    4. **保存更改**:一旦输入了URL,Dreamweaver会自动将图像设置为超级链接,用户点击该图像就会跳转至指定的网页。 ### 关键点和注意事项 - 在添加超链接时,确保URL地址是正确的,否则链接将无法正常工作。 - ...

    取cad中选中矩形的角点坐标

    获取cad中选中多段线(矩形)的角点坐标,并存入桌面“角点坐标.txt”文件中

    论文研究-用于图像分割的粗糙集改进模糊聚类方法.pdf

    首先将图像划分为互相重叠的子块,使用自适应匹配阈值对每个子块进行聚类。然后对各子块中选为背景那一类的图像进行增益补偿,减少相邻子块间亮度差异,并且通过设置先验增益使背景亮度符合当前输入图像。最后,使用...

    在字符串中选数字在字符串中选数字

    在IT领域,尤其是在编程与数据处理中,从字符串中提取数字是一项常见的需求。根据给定的文件信息,我们可以深入探讨这一主题,理解其背景、应用场景、实现方法以及代码示例中的具体逻辑。 ### 标题解析:在字符串...

    选中word对象区域选中word对象区域选中word对象区域

    标题和描述中提到的"选中word对象区域"可能是指在Microsoft Word文档中选择特定的图形、表格、文本框或任何非文本元素的过程。在Word中,这些对象是文档的一部分,但它们可以独立于文本进行操作。理解如何精确地选中...

    基于LIBSVM的图像分类

    2. 特征提取,选择感兴趣区域,即选取训练集,在这里选取了六块,即在六类事物中选取,之后就是将三维的块–&gt;二维。 3. 在选取的块中选100个点作为训练集。 4. 利用选取的训练样本建立分类模型。 5. 预测分类 6....

Global site tag (gtag.js) - Google Analytics