Rubrik: Grafik und Font · Grafische Effekte | VB-Versionen: VB2005, VB2008 | 09.10.08 |
Rahmen um Grafik zeichnen Ein Rahmen um eine Grafik zu zeichnen kann oft sinnvoll sein, um diese etwas hervorzuheben. | ||
Autor: Jan Gräfen | Bewertung: | Views: 15.008 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Vor Kurzem habe ich ein Programm geschrieben, in dem man unter anderem Bilder importieren konnte. Nun sieht es natürlich schöner aus, wenn man diese Bilder mit einer Kontur versieht. VB bietet dazu zwei Möglichkeiten:
- Die Verwendung einer Picturebox mit entsprechenden Borderstyle
- Die Kontur direkt auf die Grafik zu zeichnen
Die erste Variante funktioniert klasse, wenn die Grafiken immer die selbe Höhe und Breite haben und sich somit exat in eine Picturebox skalieren lassen.
Problematisch wird es aber dann, wenn die Seitenverhältnisse variieren, man das Bild aber nicht verzerren will, sprich die Seitenverhältnisse beibehalten möchte. Hier bietet es sich also an den Rahmen der Picturebox zu deaktivieren und selbst Hand anzulegen.
Dazu habe ich folgende Funktion geschrieben:
Public Function RahmenZeichnen(ByVal Grafik As Image) As Image Dim bmp As System.Drawing.Bitmap = Grafik Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer ' weißen Rahmen zeichnen For a = 0 To Grafik.Width - 1 bmp.SetPixel(a, 1, Color.White) bmp.SetPixel(a, Grafik.Height - 2, Color.White) Next a For b = 0 To Grafik.Height - 1 bmp.SetPixel(1, b, Color.White) bmp.SetPixel(Grafik.Width - 2, b, Color.White) Next b ' schwarzen Rahmen zeichnen For c = 0 To Grafik.Width - 1 bmp.SetPixel(c, 0, Color.Black) bmp.SetPixel(c, Grafik.Height - 1, Color.Black) Next c For d = 0 To Grafik.Height - 1 bmp.SetPixel(0, d, Color.Black) bmp.SetPixel(Grafik.Width - 1, d, Color.Black) Next d ' Grafik ausgeben Return bmp End Function
Anwendungsbeispiel:
RahmenZeichnen(PictureBox1.Image) PictureBox1.Refresh()
Erweiterung des Tipps von Dieter Otter
Erstellt man ein Graphics-Objekt der übergebenen Grafik lässt sich der Rahmen schneller über die Methode "DrawRectangle" zeichnen. Weiterhin könnte man die Funktion durch Überladung um
zwei weitere Parameter erweitern, in denen man die Farbe des Rahmens individuell festlegen kann:
''' <summary> ''' Zeichnet einen schwarz/weißen Rahmen um ein Image-Objekt ''' </summary> ''' <param name="Grafik">Originalgrafik</param> ''' <returns>Neues Image-Objekt mit Rahmen</returns> Public Function RahmenZeichnen(ByVal Grafik As Image) As Image ' Standardfarben weiß und schwarz verwenden Return RahmenZeichnen(Grafik, Color.White, Color.Black) End Function
''' <summary> ''' Zeichnet einen Rahmen in den angegebenen Farben um ein Image-Objekt ''' </summary> ''' <param name="Grafik">Originalgrafik</param> ''' <param name="innerColor">innere Rahmenfarbe</param> ''' <param name="outerColor">äußere Rahmenfarbe</param> ''' <returns>Neues Image-Objekt mit Rahmen</returns> Public Function RahmenZeichnen(ByVal Grafik As Image, _ ByVal innerColor As Color, _ ByVal outerColor As Color) As Image ' Neus Bitmap-Objekt aus übergebener Grafik Dim bmp As New System.Drawing.Bitmap(Grafik) Using g As Graphics = Graphics.FromImage(bmp) ' weißen Rahmen zeichnen Dim r As New Rectangle(1, 1, Grafik.Width - 3, Grafik.Height - 3) g.DrawRectangle(New Pen(innerColor), r) ' schwarzen Rahmen zeichnen r = New Rectangle(0, 0, Grafik.Width - 1, Grafik.Height - 1) g.DrawRectangle(New Pen(outerColor), r) End Using ' neue Grafik zurückgeben Return bmp End Function
Obige Funktionen verändert nicht das Originalbild, sondern erstellen ein neues Image-Objekt mit Rahmen.
Anwendungsbeispiel:
' Standard-Rahmenfarbe schwarz/weiß PictureBox1.Image = RahmenZeichnen(PictureBox1.Image)
' benutzerdefinierte Farben für den Rahmen verwenden PictureBox1.Image = RahmenZeichnen(PictureBox1.Image, Color.White, Color.Red)