Grafik Code Konvertert (hex converter) in Python

by

in

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.

Python
'''
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:

Python
# 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})"')