Code-Beispiel
HSV<->RGB
| Lizenz: | Erster Autor: | Letzte Bearbeitung: | 
| k. A. |  Eternal_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:
    HSV-Farbraum-Wiki
HSV-Farbraum-Wiki
    HSV Modell
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 | |||||||
|---|---|---|---|---|---|---|---|
| 
 | 
 
 | ||||||

 Wer ist online?
 Wer ist online? Buchempfehlung
 Buchempfehlung
 FreeBASIC-Chat
 FreeBASIC-Chat
 FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!
			FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us! Bearbeiten
 Bearbeiten Versionen
 Versionen