Das Modul kann verwendet werden, um einen HEX Farbcode (ff0000) in verschiedene Repräsentationen umzuwandeln. Das Modul ist entstanden, dass die Dokumentation von «colorsys» ziemlich rudimentär ist und ich lange Suchen musste, bis ich den richtigen Ansatz gefunden hatte.
Dokumentation «colorsys»: https://docs.python.org/3/library/colorsys.html
- CSS Namen: red
- RGB: rgb(255,0,0)
- HSL: hsl(0, 100%, 50%)
- HSV: hsv(0, 100%, 100%)
- YIQ: yiq(0.3000,0.5990,0.2130)
Für mehr Information sie folgende Wikipedia-Artikel:
https://de.wikipedia.org/wiki/Farbe
https://de.wikipedia.org/wiki/RGB-Farbraum
https://de.wikipedia.org/wiki/HSV-Farbraum
https://de.wikipedia.org/wiki/YIQ-Farbmodell
https://de.wikipedia.org/wiki/Webfarbe
Beschreibung der fünf Funktionen, die mit der Umwandlung von Farbwerten arbeiten.
Die Funktion hex_to_rgb
akzeptiert einen Hexadezimalcode als Eingabe (z.B. «#ffffff») und gibt ein Tupel zurück, das die Werte für Rot, Grün und Blau in Dezimal- und Normalisierungsformaten sowie eine RGB-Farbkodierung enthält. Wenn der Eingabewert kein gültiger Hexadezimalcode ist, gibt die Funktion eine Fehlermeldung aus.
Die Funktion hex_to_name
akzeptiert auch einen Hexadezimalcode als Eingabe und gibt den Namen der Farbe zurück, die dem Code am nächsten kommt, basierend auf den CSS-Namen. Wenn der Eingabewert kein gültiger Hexadezimalcode ist oder kein Name gefunden werden kann, gibt die Funktion den Wert «no css name» zurück.
Die Funktionen rgb_to_hsl
und rgb_to_hsv
akzeptieren die normalisierten Werte für Rot, Grün und Blau als Eingabe und geben die Werte für die entsprechenden Farbräume HSL und HSV sowie die Farbkodierungen zurück. Die Funktionen verwenden die in Python eingebaute colorsys
-Bibliothek, um die Umrechnungen durchzuführen.
Schliesslich gibt es die Funktion grb_to_yiq
, die die normalisierten Werte für Rot, Grün und Blau akzeptiert und die entsprechenden Werte für den Farbraum YIQ zurückgibt. Die Funktion verwendet auch die colorsys
-Bibliothek.
'''
Ein keines Pyton Modul um Hex-Farbwerte in verschiedene Formate um zu wandeln.
Das Modul wurde durch diesen Artikel inspieriert: https://coderz.club/RGB-to-HSL-HSV-YIQ/
Das Error Handling ist mur ganz rudimentaer implementiert.
Autor: Thomas Cigolla, 16.02.2023
'''
import colorsys
import webcolors
import re
def hex_to_rgb(hex_string): # input Format #ffffff
match = re.search(r'^#(?:[0-9a-fA-F]{3}){1,2}$', hex_string) # Test if strin a hex value
if match:
if len(hex_string) == 4: # if hex code only 3 digit then expand it to 6 digit
hex_string = webcolors.normalize_hex(hex_string)
if len(hex_string) == 7:
# Strips the newline characters and '#'
hexCodeStr = hex_string.strip("#\r\n")
# Convert hex to decimal
r = int(hexCodeStr[0:2], 16)
g = int(hexCodeStr[2:4], 16)
b = int(hexCodeStr[4:6], 16)
# normalize 0 to 1
r_norm = r / 255
g_norm = g / 255
b_norm = b / 255
rgb = f'rgb({r},{g},{b})'
return r, g, b, r_norm, g_norm, b_norm, rgb
else:
print ("String is not valid: ", hex_string )
else:
print ('Hex is not valid: ', hex_string)
def hex_to_name(hex_string):
try:
name = webcolors.hex_to_name(hex_string)
return name
except ValueError:
#print (f'{hex_string} has no defined color name in html4.')
return "no css name"
def rgb_to_hsl(r_norm, g_norm, b_norm):
# Convert RGB to HLS (more commonly known as HSL)
h,l,s = colorsys.rgb_to_hls(r_norm, g_norm, b_norm)
h *= 360
s *= 100
l *= 100
hsl = f'hsl({h:0.0f}, {s:0.0f}%, {l:0.0f}%)'
return h, s, l, hsl
def rgb_to_hsv(r_norm, g_norm, b_norm):
# Convert RGB to HSV
h,s,v = colorsys.rgb_to_hsv(r_norm, g_norm, b_norm)
h *= 360
s *= 100
v *= 100
hsv = f'hsv({h:0.0f}, {s:0.0f}%, {v:0.0f}%)'
return h, s, v, hsv
def grb_to_yiq(r_norm, g_norm, b_norm):
# Convert RGB to YIQ
y,i,q = colorsys.rgb_to_yiq(r_norm, g_norm, b_norm)
return y, i, q
Beispiel:
# example for usage
def print_codes_comma_delimiter(hex_string):
# Output
r, g, b, r_norm, g_norm, b_norm, rgb = hex_to_rgb(hex_string)
h, s, l, hsl = rgb_to_hsl(r_norm, g_norm, b_norm)
h, s, v, hsv = rgb_to_hsv(r_norm, g_norm, b_norm)
y, i, q = grb_to_yiq(r_norm, g_norm, b_norm)
name = hex_to_name(hex_string)
print(f'{hex_string},"{name}","{rgb}","rgb({r},{g},{b})","{hsl}","hsl({h:0.0f}°, {s:0.1f}%, {l:0.1f}%)","{hsv}","hsv({h:0.0f}°, {s:0.1f}%, {v:0.1f}%)","yiq({y:0.4f},{i:0.4f},{q:0.4f})"')