RGB-Farbanteile ermitteln

Veröffentlicht: 08. Jan 2002 | Aktualisiert: 13. Jun 2004

Von Mathias Schiffer

Zur Zusammensetzung eines Farbwertes aus seinen Rot-, Grün- und Blauanteilen bietet Visual Basic Ihnen die Funktion RGB an, die Ihnen den RGB-Farbwert der Mischung zurückliefert. So ergibt sich etwa ein dunkler Blauton aus den Anteilen 50, 10 und 125:

Me.BackColor = RGB(50, 70, 125)

Den umgekehrten Weg - das Ermitteln der Farbanteile aus einem Farbwert - unterstützt Visual Basic nicht mit einer eingebauten Funktion. Doch auch diese Information läßt sich vergleichsweise einfach ermitteln, betrachtet man den Aufbau eines Farbwerts in hexadezimaler Schreibweise:

Als Long-Wert besteht ein Farbwert aus 32 Bits, also 8 hexadezimalen Stellen, die sich nach dem Muster "&HXXBBGGRR" zusammensetzen. Dabei sind R, G und B als Platzhalter für die Anteile der einzelnen Farbkomponenten vorgesehen. Eine besondere Bedeutung, die über eine reine Umkehrfunktion für die RGB-Funktion hinausgeht, kommt dem Platzhalter "XX" zu: Ist er ungleich 0, handelt es sich um eine Farbe aus der Systemfarbpalette. In diesem Fall geben die folgenden Informationen statt direkter Farbinformationen die Nummer der Farbe in der Systempalette zurück. Die API-Funktion GetSysColor steht in einem solchen Fall zur Verfügung, um aus dem Palettenindex einen echten RGB-Farbwert zu ermitteln, mit dem dann weiter gearbeitet werden kann:

' Handliche Aufzählung und API-Deklaration: 
Private Enum RGBEnum 
  rgbRed = vbRed 
  rgbGreen = vbGreen 
  rgbBlue = vbBlue 
End Enum 
Private Declare Function GetSysColor _ 
  Lib "user32" ( _ 
  ByVal nIndex As Long _ 
  ) As Long 
' SplitRGB gibt je nach Übergabe von rgbRed, rgbGreen oder rgbBlue 
' den Rot-, Blau- oder Grünanteil einer in Color übergebenen 
' Farbe zurück: 
Private Function SplitRGB(ByVal Color As Long, ByVal Part As RGBEnum) As Byte 
  ' Ist Color ein RGB-Farbwert oder ein Pallettenindex? 
  If (Color And &HFF000000) <> 0 Then 
    ' Palettenindex in RGB-Farbe umwandeln: 
    Color = GetSysColor(Color And &HFFFFFF) 
  End If 
  ' Gewünschten Farbanteil separieren 
  Select Case Part 
    Case rgbRed:    SplitRGB = Color And &HFF& 
    Case rgbGreen:  SplitRGB = Color \ &H100& And &HFF& 
    Case rgbBlue:   SplitRGB = Color \ &H10000 And &HFF& 
  End Select 
End Function