vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Grafik und Font · Grafische Effekte   |   VB-Versionen: VB2008, VB2010, VB201222.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 HerrmannBewertung:     [ Jetzt bewerten ]Views:  8.213 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein 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.

Dieser Tipp wurde bereits 8.213 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel