Hallo Leute,
ich hatte letztes Jahr bei der Erstellung einer Windows APP die Herausforderung Vektrografiken im SVG Format in ein Grafikformat zu bringen oder am Bildschirm anzeigen zu lassen.
Gestern hatte sich mein Knoten gelöst und durch einen Tipp im Netz habe ich nun endlich eine Lösung gefunden für die keine externe Komponente erforderlich ist.
Man benötigt lediglich ein Webbrowser-Control
Grob erklärt wird die SVG-Datei im Webbrowser-Control angezeigt und dann dort über eine Art Handle (iViewObject) als Grafik abgegriffen und in die Picturebox kopiert.
Genauer wird dies in den Microsoft-Docs beschrieben: docs.microsoft.com/en-us/windo…idl/nn-oleidl-iviewobject
Die Grafik in der Picturebox kann man dann beliebig weiterbearbeiten (z.B. speichern).
Bzw. könnte man die Picturebox auch ganz weglassen und bereits mit der erzeugten Bitmap
Das Webbrowser-Control muss immer in die Größe der gewünschten Zielgrafik gebracht werden. Das sieht in einer Form nicht schön aus.
Man kann das Webbrowser-Control aber auch außerhalb der sichtbaren Form darstellen - der Grafikinhalt wird dennoch ausgelesen.
Hier mein Code einer Windows-Forms-Anwendung
Hier eine SVG Grafik und das daraus erstelle JPG Image.
Die SVG Grafik enthält neben Vektroinformationen zusätzlich auch eine BMP-Background-Image.
ich hatte letztes Jahr bei der Erstellung einer Windows APP die Herausforderung Vektrografiken im SVG Format in ein Grafikformat zu bringen oder am Bildschirm anzeigen zu lassen.
Gestern hatte sich mein Knoten gelöst und durch einen Tipp im Netz habe ich nun endlich eine Lösung gefunden für die keine externe Komponente erforderlich ist.
Man benötigt lediglich ein Webbrowser-Control
WebBrowser_SVG
und eine Picturebox PictureBox_SVG
.Grob erklärt wird die SVG-Datei im Webbrowser-Control angezeigt und dann dort über eine Art Handle (iViewObject) als Grafik abgegriffen und in die Picturebox kopiert.
Genauer wird dies in den Microsoft-Docs beschrieben: docs.microsoft.com/en-us/windo…idl/nn-oleidl-iviewobject
Die Grafik in der Picturebox kann man dann beliebig weiterbearbeiten (z.B. speichern).
Bzw. könnte man die Picturebox auch ganz weglassen und bereits mit der erzeugten Bitmap
bmp
weiterarbeitenDas Webbrowser-Control muss immer in die Größe der gewünschten Zielgrafik gebracht werden. Das sieht in einer Form nicht schön aus.
Man kann das Webbrowser-Control aber auch außerhalb der sichtbaren Form darstellen - der Grafikinhalt wird dennoch ausgelesen.
Hier mein Code einer Windows-Forms-Anwendung
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Public Class FRM_Mainform
- <ComImport()>
- <Guid("0000010d-0000-0000-C000-000000000046")>
- <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
- Public Interface IViewObject
- <PreserveSig>
- Function Draw(dwDrawAspect As UInteger, lindex As Integer, pvAspect As IntPtr, ptd As IntPtr, hdcTargetDev As IntPtr, hdcDraw As IntPtr, lprcBounds As Rectangle, lprcWBounds As IntPtr, pfnContinue As IntPtr, dwContinue As Integer) As Integer
- End Interface
- Private Sub FRM_Mainform_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- WebBrowser_SVG.Width = 1000 'gewünschte Pixelbreite der zu erzeugenden Grafik
- WebBrowser_SVG.Height = 2000 'gewünschte Pixelhöhe der zu erzeugenden Grafik
- WebBrowser_SVG.ScrollBarsEnabled = False
- WebBrowser_SVG.Url = New Uri(String.Format("c:\Testgrafik.svg"))
- End Sub
- Private Sub WebBrowserSVG_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser_SVG.DocumentCompleted
- Dim nWidth = WebBrowser_SVG.Width
- Dim nHeight = WebBrowser_SVG.Height
- Dim bmp = New Bitmap(nWidth, nHeight)
- Dim gr As Graphics = Graphics.FromImage(bmp)
- Dim hDC = gr.GetHdc()
- Dim rc = New Rectangle(0, 0, nWidth, nHeight)
- Dim viewObject = CType(WebBrowser_SVG.Document.DomDocument, IViewObject)
- viewObject.Draw(CUInt(DVASPECT.DVASPECT_CONTENT), -1, CType(0, IntPtr), CType(0, IntPtr), CType(0, IntPtr), hDC, rc, CType(0, IntPtr), CType(0, IntPtr), 0)
- gr.ReleaseHdc(hDC)
- 'Optional die Bitmap in eine PictureBox kopieren oder direkt weiterverarbeiten
- PictureBox_SVG.Image = bmp
- PictureBox_SVG.Image.Save("c:/SVGAlsGrafik.jpg")
- End Sub
- End Class
Hier eine SVG Grafik und das daraus erstelle JPG Image.
Die SVG Grafik enthält neben Vektroinformationen zusätzlich auch eine BMP-Background-Image.
Liebe Grüße
Roland Berghöfer
Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
Roland Berghöfer
Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at