Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Grafik und Fonts

HSV<->RGB

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.MitgliedEternal_Pain 09.03.2010

Bei dem HSV Farbmodel kann eine Farbe ueber die Eigenschaften
Hue(Farbton),Saturation(Sättigung) und Value(Helligkeit) definiert
werden


Quellen:
Externer Link!HSV-Farbraum-Wiki
Externer Link!HSV Modell

RGBtoHSV:
Die Eingabe der Funktion RGBtoHSV ist ein 24bit Wert
der die jeweiligen Anteile zu je 8Bit von Rot, Grün und Blau enthaelt.
#RRGGBB.
Diese kann man direkt angeben oder mit hilfe
der RGB Funktion von FreeBASIC.

Waerend Hue(Farbton) eigentlich immer in einem Winkel [0,360] angegeben werden
Varieren die Angaben von Saturation(Sättigung) und Value(Helligkeit) in den
unterschiedlichen Programmen oftmals.
Die meisten jedoch geben diese als Prozent [0,100] zurueck.

Innherhalb der Funktion werden alle Anteile mit [0,1] berechnet.
Was das aendern der Ausgaben vereinfacht.
So lassen wir uns die Möglichkeit offen das Ausgabemodell der Funktion
selbst zu wahlen und zu aendern.

Dieses Beispiel gibt das von mir gewohnte Modell zurück.
Dabei werden die Anteiligen Werte in Ganzzahlen (Integer)
als 25bit Wert zurückgegeben.
#HHHSSVV
Hue[0,360] in Grad
Saturation[0,100] in Prozent
Value[0,100] in Prozent

Die einzelnen Anteile lassen sich Problemlos wiefolgt auseinander nehmen.

    UmgerechneterRGBWert=RGBtoHSV(RGB(255,0,0))

    Hue=HiWord(UmgerechneterRGBWert)
    Saturation=HiByte(LoWord(UmgerechneterRGBWert))
    Value=LoByte(LoWord(UmgerechneterRGBWert))

Function RGBtoHSV(Byval RGBValue as UInteger) as UInteger
    Dim as Double Red,Green,Blue
    Dim as Double Hue   , Saturation, Value, Diff
    Dim as Double minCol, maxCol

    'Rot,Grün und Blau anteile trennen und norminieren [0,1]
    Red   = LoByte(HiWord(RGBValue))/255
    Green = HiByte(LoWord(RGBValue))/255
    Blue  = LoByte(LoWord(RGBValue))/255

    'Grösten und kleinsten Anteil ermitteln
    minCol = IIF(Red<=Green,IIF(Red<=Blue,Red,Blue),IIF(Green<=Blue,Green,Blue))
    maxCol = IIF(Red>=Green,IIF(Red>=Blue,Red,Blue),IIF(Green>=Blue,Green,Blue))

    If minCol=maxCol Then Return Int(maxCol*100)

    'Differenz der Anteile
    Diff = maxCol - minCol

    If (Diff < (1e-6) ) Then
        Hue=0
    ElseIf maxCol=Red Then
        Hue=(1/6)*((Green-Blue)/Diff)+1
        Hue=Frac(Hue)
    ElseIf maxCol=Green Then
        Hue=(1/6)*((Blue-Red)/Diff)+(1/3)
    ElseIf maxCol=Blue Then
        Hue=(1/6)*((Red-Green)/Diff)+(2/3)
    End If

    If maxCol < (1e-6) Then
        Saturation = 0
    Else
        Saturation = (1 - (minCol/maxCol))
    End If

    Value=maxCol

    'Anteile nach gewüschten Ausgabemodell umrechnen
    Hue*=360 '[0,360]grad
    Saturation*=100 '[0,100]prozent
    Value*=100 '[0,100]prozent

    Return (Int(Hue) SHL 16)+(Int(Saturation) SHL 8)+Int(Value)
End Function


HSVtoRGB:
Die Gegenfunktion zu RGBtoHSV.
Die Eingabe der Funktion HSVtoRGB ist ein 25bit Wert
der die jeweiligen Anteile zu je 9-8-8Bit von Hue[0,360],
Saturation[0,100] und Value[0,100] enthaelt.
#HHHSSVV

Mit einer zusätzlichen Funktion HSV kann es auch direkt angeben werden.

Function HSV(Byval Hue as Double, Byval Saturation as Double, Byval Value as Double) as UInteger
    Dim as Integer H,S,V
    H=Hue
    S=Saturation
    V=Value

    If     H<0   Then
        Do : H+=360 : Loop While H<0
    ElseIf H>359 Then
        Do : H-=360 : Loop While H>359
    End If

    S=IIF(S<0,0,IIF(S>100,100,S))
    V=IIF(V<0,0,IIF(V>100,100,V))

    Return (H SHL 16)+(S SHL 8)+V
End Function


Der Rückgabewert ist ein mit der FreeBASIC Funktion RGB erstellter 32Bit Wert
mit den RGB und Alpha Anteilen.
#AARRGGBB

Die einzelnen Anteile lassen sich Problemlos wiefolgt auseinander nehmen.

    UmgerechneterHSVWert=HSVtoRGB(HSV(0,100,100))

    Alpha=HiByte(HiWord(UmgerechneterHSVWert))
    Red=LoByte(HiWord(UmgerechneterHSVWert))
    Green=HiByte(LoWord(UmgerechneterHSVWert))
    Blue=LoByte(LoWord(UmgerechneterHSVWert))


Function HSVtoRGB(Byval HSVValue as UInteger) as UInteger
    Dim as Double Hue,Saturation,Value
    Dim as Double f,p,q,t
    Dim as Double Red,Green,Blue

    'Farbton,Sättigung und Helligkeit trennen und Norminieren [0,1]
    Hue        = HiWord(HSVValue)/360
    Saturation = HiByte(LoWord(HSVValue))/100
    Value      = LoByte(LoWord(HSVValue))/100

    f = Frac((Hue * 6))
    p = Value * (1-Saturation)
    q = Value * (1-(f*Saturation))
    t = Value * (1-((1-f)*Saturation))

    Select Case (Fix(Hue * 6))
        Case 0
            Red   = Value
            Green = t
            Blue  = p
        Case 1
            Red   = q
            Green = Value
            Blue  = p
        Case 2
            Red   = p
            Green = Value
            Blue  = t
        Case 3
            Red   = p
            Green = q
            Blue  = Value
        Case 4
            Red   = t
            Green = p
            Blue  = Value
        Case 5
            Red   = Value
            Green = p
            Blue  = q
    End Select

    'Ausgabe Vorbereiten Anteile[0,255]
    Red=Int(Red*255)
    Green=Int(Green*255)
    Blue=Int(Blue*255)

    Return RGB(Red,Green,Blue)
End Function

Hinweis:
Da wir bei unseren Beispiel die Ein-/Ausgabe in Ganzzahlen (Integer)
zurückgeben, kann es bei der Umrechnung von RGB zu HSV und zurueck
vereinzelt zu abweichungen bedingt durch das runden auf ganzzahlen kommen.


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 09.03.2010 von MitgliedEternal_Pain angelegt.
  • Die aktuellste Version wurde am 09.03.2010 von MitgliedEternal_Pain gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen