Wie berechnet man in VB.NET 2003 aus einer RGB-Farbe den HSV-Wert?

Antwort vom

**Den HSV-Wert berechnest du aus RGB, indem du zuerst R, G und B auf 0–1 normierst, dann den größten und kleinsten Kanal vergleichst: Daraus ergeben sich H über die Kanal-Differenz, S über `delta/max` und V direkt über den Maximalwert.** ## Prinzip Gegeben sind `R`, `G`, `B` im Bereich `0..255`. Zuerst normieren: ```vb r = R / 255 g = G / 255 b = B / 255 ``` Dann: - `max = größter Wert von r, g, b` - `min = kleinster Wert von r, g, b` - `delta = max - min` Daraus folgt: - **V** = `max` - **S** = `0`, wenn `max = 0`, sonst `delta / max` - **H**: - wenn `delta = 0` → `H = 0` - wenn `max = r` → `H = 60 * (((g - b) / delta) Mod 6)` - wenn `max = g` → `H = 60 * (((b - r) / delta) + 2)` - wenn `max = b` → `H = 60 * (((r - g) / delta) + 4)` Wird `H` negativ, addierst du `360`. Der wichtige Unterschied: **V ist nicht die durchschnittliche Helligkeit, sondern einfach der größte RGB-Anteil.** Genau deshalb ist HSV für Farbwahl oft praktischer als ein bloßer Mittelwert. ## VB.NET-2003-Beispiel In VB.NET 2003 solltest du mit `Double` rechnen, nicht mit `Integer`, sonst verlierst du durch Ganzzahldivision sofort Genauigkeit. ```vb Public Sub RGBtoHSV(ByVal R As Integer, ByVal G As Integer, ByVal B As Integer, _ ByRef H As Double, ByRef S As Double, ByRef V As Double) Dim rNorm As Double Dim gNorm As Double Dim bNorm As Double Dim maxVal As Double Dim minVal As Double Dim delta As Double rNorm = R / 255.0 gNorm = G / 255.0 bNorm = B / 255.0 maxVal = rNorm If gNorm > maxVal Then maxVal = gNorm If bNorm > maxVal Then maxVal = bNorm minVal = rNorm If gNorm < minVal Then minVal = gNorm If bNorm < minVal Then minVal = bNorm delta = maxVal - minVal ' Value V = maxVal ' Saturation If maxVal = 0 Then S = 0 Else S = delta / maxVal End If ' Hue If delta = 0 Then H = 0 ElseIf maxVal = rNorm Then H = 60.0 * ((gNorm - bNorm) / delta) ElseIf maxVal = gNorm Then H = 60.0 * (((bNorm - rNorm) / delta) + 2.0) Else H = 60.0 * (((rNorm - gNorm) / delta) + 4.0) End If If H < 0 Then H = H + 360.0 End Sub ``` ## Beispiel Für `RGB(255, 0, 0)` gilt: - `r = 1`, `g = 0`, `b = 0` - `max = 1`, `min = 0`, `delta = 1` Ergebnis: - `H = 0` - `S = 1` - `V = 1` Also: **reines Rot = HSV(0°, 100%, 100%)**. ## Praktisch wichtig Wenn du den Wert später anzeigen willst, ist diese Umrechnung meist sinnvoll: - `H` in `0..360` - `S` in Prozent: `S * 100` - `V` in Prozent: `V * 100` Typischer Fehler in altem VB.NET: **`/ 255` nicht mit Integern rechnen lassen.** Deshalb immer `255.0` verwenden.

Kategorie: Technik Tags: Rgb Hsv Vbnet