Anregung zu diesem Tipp fand ich auf: Ich verwende diese Funktion mit relativ kleinen Bitmaps und zwar zu dem Zweck, die passende Forecolor für Labels zu bestimmen, die selbst eine transparente Backcolor besitzen und über einem Hintergrund angeordnet sind, der ein Bild darstellt. Dann schneide ich gewissermaßen ein Bitmap aus dem Hintergrund genau in der Größe des Labels heraus, ermittle die durchschnittliche Farbe dieser Bitmap und berechne als Forecolor entweder schwarz oder weiß mit einer weiteren Hilfsfunktion. Zum Code Imports System.Drawing.Drawing2D ... ''' <summary> ''' Ermitteln der Durchschnittsfarbe einer Bitmap in RGB ''' </summary> ''' <param name="theBitmap">die Bitmap</param> ''' <returns>die durchschnittliche Farbe</returns> Public Function GetAverageRGB(ByVal theBitmap As Bitmap) As Color Dim bmp As New Bitmap(1, 1) Using g As Graphics = Graphics.FromImage(bmp) ' Der Interpolation Modus muss auf ' HighQualityBilinear oder HighQualityBicubic eingestellt werden ' damit diese Methode arbeitet. g.InterpolationMode = InterpolationMode.HighQualityBilinear g.DrawImage(theBitmap, New Rectangle(0, 0, 1, 1)) End Using Dim pixel As Color = bmp.GetPixel(0, 0) ' pixel enthält Mittelwerte für die ganze orig Bitmap Return Color.FromArgb(pixel.R, pixel.G, pixel.B) End Function Die Hilfsfunktion für die Berechnung schwarz/weißer Forecolor ''' <summary> ''' Klare Textfarbe (S/W) bei variabler Hintergrundfarbe ''' </summary> ''' <param name="farbe">Backgroundfarbe</param> ''' <returns>Foregroundfarbe schwarz oder weiß</returns> Private Function GegenFarbe_sw(ByVal farbe As Color) As Color Dim R As Integer = farbe.R ' Farb-Anteile Dim G As Integer = farbe.G Dim B As Integer = farbe.B R = R * 2 : G = G * 5 : B = B If R + G + B > 1024 Then Return Color.Black ' schwarz, weil sehr hell Else Return Color.White ' weiss, weil sehr dunkel End If End Function als auch die Hilfsfunktion zur Erstellung eines Ausschnitts einer Bitmap ''' <summary> ''' beschneidet eine Bitmap ''' </summary> ''' <param name="bmp">die Bitmap</param> ''' <param name="rect">die Rechteck-Koordinaten des Bildausschnitts</param> ''' <param name="pixf">das Pixelformat der Bitmap</param> ''' <returns>Bitmap-Object beschnitten</returns> Public Function CropBitmap(ByRef bmp As Bitmap, ByVal rect As Rectangle, _ Optional ByVal pixf As Imaging.PixelFormat = _ Imaging.PixelFormat.PixelFormat.Format24bppRgb) As Bitmap Dim croppedBmp As New Bitmap(rect.Width, rect.Height) croppedBmp = bmp.Clone(rect, pixf) Return croppedBmp End Function Dann kann man bspw. in Bezug auf oben geschilderte Situation (Form mit Hintergrundbild, Panel und darin ein Labelcontrol) folgendes programmieren: Dim formBG As New Bitmap(Me.ClientRectangle.Width, _ Me.ClientRectangle.Height), labBG As Bitmap Dim pp, pl As New Point formBG = Me.BackgroundImage pp = Panel1.Location pl = pp + Label1.Location labBG = CropBitmap(formBG , pl.X, pl.Y, Label1.Width, Label1.Height) Label1.ForeColor = GegenFarbe_sw(GetAverageRGB(labBG)) formBG.Dispose() labBG.Dispose() Damit wird der Labeltext entweder in schwarz oder in weiß entsprechend der Helligkeit des darunter liegenden Bildausschnitts angezeigt. Dieser Tipp wurde bereits 8.234 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevPopUp 2.0 Dynamische Kontextmenüs! Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |