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 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 | |||||||
---|---|---|---|---|---|---|---|
|
|