Wie ordnet man terminale Farbsequenzen in benutzerfreundliche Farbabstufungen ein?

Wie ordnet man terminale Farbsequenzen in benutzerfreundliche Farbabstufungen ein?

Ich habe dieses Skript erstellt, um Terminalfarben anzuzeigen, aber die Anordnung der Farben verstehe ich nicht.

Hier ist das Skript, das ziemlich einfach ist. Es erhöht einfach den Farbcode für die 256-Farben-Palette und ordnet sie in Reihen zu je 6 an.

#!/bin/env python3

def fg(n):
    assert -1 < n < 256, f"{n} value outside (0,255)"
    return f"\x1b[38;5;{n}m"

def bg(n):
    assert -1 < n < 256, f"{n} value outside (0,255)"
    return f"\x1b[48;5;{n}m"
    
RESET = "\x1b[0m"

print("The 1st 16 colors")
for i in range(0,16):
    print(f"{fg(0)}{bg(i)}[{i:03d}]{bg(0)}" , end = RESET)

print("\nthe rest\n")
for i in range(16,255,6):
    for j in range(0,6):
        print(f"{fg(0)}{bg(i + j)}[{i + j:03d}]", end = RESET)
    print()

Das gibt dieses Raster aus und ich denke, es könnte besser sein.

Bildbeschreibung hier eingeben

Aber ich würde gerne wissen, wie ich das auf eine benutzerfreundlichere Art und Weise gestalten kann. Etwas Ähnliches wie dieses Raster unten, wo die Farben Abstufungen desselben Farbtons sind. Gibt es ein Verfahren, um das zu tun?

Bildbeschreibung hier eingeben

Ziel ist es, eine Farbkorrekturfunktion zu ermöglichen, die auf die Terminalcodierung angewendet werden kann.

Antwort1

Basierend auf dem Kommentar von @DavidPostill habe ich verstanden, dass ich mir die Ebenen eines RGB-Farbblocks ansehe. Diese Antwort beantwortet also teilweise meine eigene Frage. Allerdings musste ich die Werte jedes Farbtons aus mehreren Listen herauspicken, die ich lieber in einer Funktion kapseln würde, die 2 Farben im Block annehmen und die Töne dazwischen berechnen könnte.

Um den Farbblock zu visualisieren, ist hier eine Grafik, bei der ich jede Ecke mit dem entsprechenden Terminalfarbcode beschriftet habe.

Bildbeschreibung hier eingeben

Mir wurde klar, dass man einen Farbverlauf erhält, wenn man eine Linie von einer beliebigen Zahl zu einer anderen zeichnet. Die gegenüberliegende Ecke zu Weiß (231) wäre Schwarz (16).

Durch die Neuanordnung des terminalen Farbrasters auf diese Weise ist leichter zu erkennen, dass jede Ebene ein Ausschnitt des darüber liegenden 3D-Blocks ist (von der linken zur rechten Seite). Außerdem ist nun offensichtlich, wie Sie Farben über und durch diesen abgeflachten Block auftragen können.

Bildbeschreibung hier eingeben

Hinzufügen dieses Codes zu meinem Originalcode:

def print_color_range(name, clist):
    rangelen = len(clist)
    fore = fg(0) # black pen
    for i in range(rangelen):
        code = clist[i]
        back = bg(clist[i])
        print(f"{fore}{back}[{clist[i]:03d}]",  end = RESET)
    print(name)

WHITE_BLACK = [231,188,145,102,59,16]
WHITE_RED_BLACK     = [231,224,217,210,203,196,160,124,88,52,16]
WHITE_BLUE_BLACK    = [231,189,147,105,63,21,20,19,18,17,16]
WHITE_GREEN_BLACK   = [231,194,157,120,83,46,40,34,28,22,16]
WHITE_CYAN_BLACK    = [231,195,159,123,87,51,44,37,30,23,16]
WHITE_MAGENTA_BLACK = [231,225,219,213,207,201,164,127,90,53,16]
WHITE_YELLOW_BLACK = [231,230,229,228,227,226,184,142,100,58,16]
GREYS = [231,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,16]

print_color_range('reds', WHITE_RED_BLACK )
print_color_range('yellows', WHITE_YELLOW_BLACK    )
print_color_range('greens', WHITE_GREEN_BLACK  )
print_color_range('cyans', WHITE_CYAN_BLACK   )
print_color_range('blues', WHITE_BLUE_BLACK   )
print_color_range('magentas', WHITE_MAGENTA_BLACK)
print_color_range('white to black', WHITE_BLACK)
print_color_range('grays', GREYS)

hat dies hervorgebracht

Bildbeschreibung hier eingeben

verwandte Informationen