Rubrik: Grafik und Font · Grafische Effekte | VB-Versionen: VB2008, VB2010, VB2012 | 22.11.13 |
Die durchschnittliche Farbe einer Bitmap in RGB Der Tipp zeigt eine Funktion zur Bestimmung der durchschnittlichen Farbe einer Bitmap in RGB und die Verwendung in einem Beispiel. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 8.219 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Anregung zu diesem Tipp fand ich auf:
http://stackoverflow.com/questions/1068373/how-to-calculate-the-average-rgb-color-values-of-a-bitmap
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
Die Funktion zur Ermittlung der durchschnittlichen Farbe ist:
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
(diese Funktion ist schon in anderen Tipps von mir zitiert worden)
''' <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.