Direkt in VB.NET 2003 geht das nicht zuverlässig über System.Drawing, weil .NET 1.1 PNG zwar speichern kann, transparente GIF-Pixel dabei aber oft nicht so behandelt werden, wie man es f&uum...
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.
Verwandte Fragen
Wie erstelle, speichere und nutze ich in VB.NET 2003 eine DLL im Projekt?
In VB.NET 2003 erstellst du eine DLL als Class Library, kompilierst sie zu einer .dll und bindest sie im Hauptprojekt per Projektverweis oder Dateiverweis ein. Entscheidend ist: Nicht die DLL „m...
Wie lese und schreibe ich EXIF-Daten in VB.NET 2003?
EXIF ist keine eigene „Datei“, sondern Metadaten im Bild selbst. In VB.NET 2003 liest du EXIF über Image.PropertyItems bzw. GetPropertyItem, und schreiben kannst du nur über SetP...
Wie lasse ich im VB.NET-2003-MonthCalendar selbst gewählte Datumswerte anzeigen?
Ja: Im MonthCalendar zeigst du selbst gewählte Daten über die Fettmarkierung an. Entscheidend ist: Die Daten müssen als DateTime hinzugefügt und danach mit UpdateBoldedDates() aktu...
Wie sortiere ich in VB.NET 2003 ein Array mit 4 Spalten und x Zeilen?
Ein echtes 2D-Array in VB.NET 2003 kannst du nicht direkt mit Array.Sort sortieren; praktisch musst du die Zeilen entweder selbst tauschen oder die Daten zuerst in eine sortierbare Struktur umbauen. A...