將symbologycontrol中選中的symbol或對象轉化為映像(VB.Net源碼)

來源:互聯網
上載者:User

當我們用Symbologycontrol設定某個圖層symbol的樣式或設定指北針、比例尺的樣式時,

我們需要對其進行預覽,將這些選中的樣式以圖片的形式顯示在例如PictureBox中,這時我們就需要得到選中對象的Image,

下面是我提供的兩種方法:

一:是利用AE內建的PreviewItem方法來實現,這種方法普適性好,能適用所有Symbolgycontrol支援的對象,例如(指北針、比例尺、Symbol等)

二:是利用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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.