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

Code-Stücke können hier veröffentlicht werden.
Antworten
Xtremdiver
User
Beiträge: 16
Registriert: Samstag 22. Januar 2022, 09:21

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)
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Xtremdiver
User
Beiträge: 16
Registriert: Samstag 22. Januar 2022, 09:21

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).
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Xtremdiver
User
Beiträge: 16
Registriert: Samstag 22. Januar 2022, 09:21

ich wusste doch, das es noch eine bessere Variante gibt. Die sieht wesentlich besser aus als meine Variante. vielen Dank
Antworten