RSS
StartseiteKnowledge LibraryTop 10Impressum

Farbsplitting

Farbwerte in ihre Farbanteile Rot, Grün, Blau zerlegen und nach bzw. von HTML/CSS konvertieren.

Das Zusammmensetzen eines Long-Farbwerts aus den einzelnen Farbanteilen Rot, Grün und Blau, stellt über die RGB Funktion kein Problem dar - aber wie kommt man wieder an die R-G-B Komponenten eines Long-Farbwerts? Dieser Artikel stellt eine Möglichkeit vor und darüber hinaus zwei Funktionen zum Konvertieren eines Farbwerts in ei HTML/CSS freundliches Format und wieder zurück.

Wenn Sie unter VB mit Farbwerten hantieren, sind dies immer Long Werte und um einen solchen aus einer eigenen Farbmischung der einzelnen Farbanteile Rot, Grün, Blau zu gewinnen, bietet VB die RGB Funktion an. Wenn allerdings erst mal eine Farbe zusammen gemischt wurde, scheint es keinen Weg mehr zu geben, wieder an ihre einzelnen Farbanteile zu gelangen – eine Umkehrfunktion sucht man vergebens.

Zumindest solange man sich keinen Ersatz geschaffen hat, wie mit der Prozedur OLEColorToRGB, die aus einem Long Wert wieder die Farbanteile Rot, Grün, Blau extrahiert. Obendrein sorgt sie über die OLE API Funktion OleTranslateColor für die entsprechende Übersetzung der VB Systemfarben:

Private Declare Function OleTranslateColor Lib "olepro32" _
       (ByVal clr As OLE_COLOR, ByVal hpal As Long, _
        ByRef pcolorref As Long) As Long

Public Sub OLEColorToRGB(ByVal Color As OLE_COLOR, _
                         ByRef Red As Integer, _
                         ByRef Green As Integer, _
                         ByRef Blue As Integer)
  
  If OleTranslateColor(Color, 0, Color) Then Exit Sub

  Red = (Color And vbRed)
  Green = (Color And vbGreen) \ &H100
  Blue = (Color And vbBlue) \ &H10000
End Sub

Die Konvertierung in einen HTML/CSS konformen Farbwert stellt nun auch kein Problem mehr dar, denn die Angabe "#D2D2BE" ist nichts weiter als die hexadezimale Darstellung der Farbanteile Rot, Grün und Blau - "#RRGGBB" - in diesem Beispiel 210, 210, 190:

Public Function OLEColorToHTML(ByVal Color As OLE_COLOR) As String
  Dim Red   As String
  Dim Green As String
  Dim Blue  As String
  
  If OleTranslateColor(Color, 0, Color) Then Exit Function
  
  Red = Hex$(Color And vbRed)
  Green = Hex$((Color And vbGreen) \ &H100)
  Blue = Hex$((Color And vbBlue) \ &H10000)
  
  If Len(Red) = 1 Then Red = "0" & Red
  If Len(Green) = 1 Then Green = "0" & Green
  If Len(Blue) = 1 Then Blue = "0" & Blue
  
  OLEColorToHTML = "#" & Red & Green & Blue
End Function

Um die zweistellige Darstellung der Hex-Werte sicherzustellen, wurde bewusst auf den Einsatz der Format$-Funktion verzichtet, da diese mit den gewonnen Hex-Werten nicht korrekt umgehen konnte. Zum Beispiel wurde einigen Werten eben keine 0 vorangestellt und aus dem Wert 26 (Hex = 1A) wurde durch Einsatz der Format$-Funktion kurzerhand "00".

Für den umgekehrten Weg -vom HTML/CSS Farbwert zum Long Farbwert- müssen die einzelnen Farbeanteile aus der Zeichenfolge ausgeschnitten werden und deren Werte über die RGB - Funktion wieder zum Long-Wert zusammengefügt werden.

Der CSS1 – Standard erlaubt auch die kurze, dreistellige Darstellung eines Farbwerts im Format "#RGB". Dabei werden fehlende Werte jedoch nicht durch Nullen ersetzt, sondern durch Wiederholung des Wertes. Aus "#ADA" würde also "#AADDAA". Dies wird nun von der Funktion HTMLToOLEColor berücksichtigt:

Public Function HTMLToOLEColor(ByVal HTMLColor As String) As OLE_COLOR
  Dim Red   As Integer
  Dim Green As Integer
  Dim Blue  As Integer
  
  If (LenB(HTMLColor) = 4) Then
    Red = Val("&H" & Mid$(HTMLColor, 2, 1) & Mid$(HTMLColor, 2, 1))
    Green = Val("&H" & Mid$(HTMLColor, 3, 1) & Mid$(HTMLColor, 3, 1))
    Blue = Val("&H" & Mid$(HTMLColor, 4, 1) & Mid$(HTMLColor, 4, 1))
  Else
    Red = Val("&H" & Mid$(HTMLColor, 2, 2))
    Green = Val("&H" & Mid$(HTMLColor, 4, 2))
    Blue = Val("&H" & Mid$(HTMLColor, 6, 2))
  End If

  HTMLToOLEColor = RGB(Red, Green, Blue)
End Function