當我們用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
標簽:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網