Seite 1 von 1

Umwandeln von HSV zu RGB funktioniert - aber anders herum? Ist das optimal?

Verfasst: Montag 31. Januar 2022, 16:31
von Xtremdiver
Halli Hallo,

mit dem folgenden Code kann man wunderbar von HSV zu RGB umrechnen.
Bedingung: Hue [0...360], Sat [0...100], Val [0...100]

Code: Alles auswählen

import colorsys

Code: Alles auswählen

def hsv_to_rgb(hue, sat, val):
    hue = hue / 360
    sat = sat / 100
    val = val / 100
    return = tuple(round(i * 255) for i in colorsys.hsv_to_rgb(hue,sat,val))

nur mit der Umrechnung in die andere Richtung tue ich mich schwer. Hat jemand da einen anderen guten Ansatz?
Colorsys gibt eine Tuple zurück.

Code: Alles auswählen

def rgb_to_hsv(r,g,b):
    r = r / 255
    g = g / 255
    b = b / 255
    hsv_value = list(round(i * 100) for i in colorsys.rgb_to_hsv(value_r, value_g, value_b))
    hsv_value[0] = round(hsv_value[0] * 3.6) # Hue muss mit 360 multipliziert werden, der Rest mit 100
    return tuple(hsv_value)

Re: Umwandeln von HSV zu RGB funktioniert - aber anders herum? Ist das optimal?

Verfasst: Montag 31. Januar 2022, 16:55
von Sirius3
Was heißt "tue ich mir schwer"?
Die Fehlermeldungen, die Du erhältst sollten doch ziemlich gut beschreiben, was wo nicht passt.
Zudem solltest Du nicht runden, wenn Du danach noch mit 3.6 multiplizierst.

Re: Umwandeln von HSV zu RGB funktioniert - aber anders herum? Ist das optimal?

Verfasst: Montag 31. Januar 2022, 18:29
von Xtremdiver
Hi Sirius,

der Code an sich funktioniert, daran sollte es an sich nicht liegen.
Mir geht es nur darum, ob jemand eine Idee hat wie man diesen optimieren könnte.

colorsys.rgb_to_hsv gibt hsv Werte zurück, wo anschließend Hue mit 360, Sat und Val mit jeweils 100 multipliziert werden muss.

Wie du bestimmt gesehen hast, habe ich erst einmal alle Werte (also H,S,V) mit 100 multipliziert und in der Zeile darauf eben nur den Hue mit 3.6 (da 3.6 *100 = 360).

Re: Umwandeln von HSV zu RGB funktioniert - aber anders herum? Ist das optimal?

Verfasst: Montag 31. Januar 2022, 18:47
von __deets__
Es wurde ja schon angemerkt, dass die Rundung zu früh kommt. Ansonsten gibt’s da nicht viel zu zu sagen. Ich würde das nicht in zwei Schritten tun, weil das eher verwirrend ist. Sondern explizit die reinwerfe mit ihrem jeweiligen Multiplikator belegen & dann int(value) statt round nutzen. Aber vom Ergebnis her natürlich gleich.

Re: Umwandeln von HSV zu RGB funktioniert - aber anders herum? Ist das optimal?

Verfasst: Montag 31. Januar 2022, 19:25
von Sirius3
Bei mir ist `value_r` nicht definiert, was auch mit einer entsprechenden Fehlermeldung beantwortet wird. Und das mit dem Runden ordne ich auch in "funktioniert nicht richtig" ein.

Code: Alles auswählen

def rgb_to_hsv(r, g, b):
    h, s, v = colorsys.rgb_to_hsv(r / 255, g / 255, b / 255)
    return round(h * 360), round(s * 100), round(v * 100)

Re: Umwandeln von HSV zu RGB funktioniert - aber anders herum? Ist das optimal?

Verfasst: Montag 31. Januar 2022, 19:32
von Xtremdiver
ich wusste doch, das es noch eine bessere Variante gibt. Die sieht wesentlich besser aus als meine Variante. vielen Dank