Print a 256-color test pattern in the terminal

69,713

Solution 1

256-colour test pattern

To get the below image, use:

curl -s https://gist.githubusercontent.com/HaleTom/89ffe32783f89f403bba96bd7bcd1263/raw/ | bash

256-colour test pattern

The gist bash/zsh code is shellcheck clean, and also supports "Look Ma, no subprocesses!".


Alternatively, for a bash quicky:

for i in {0..255} ; do
    printf "\x1b[48;5;%sm%3d\e[0m " "$i" "$i"
    if (( i == 15 )) || (( i > 15 )) && (( (i-15) % 6 == 0 )); then
        printf "\n";
    fi
done

For total overkill, the granddaddy of the lot is terminal-colors, a 572-line script with multiple output formats.

You can also print a true color (24-bit) test pattern.

Solution 2

I found a nice Python script for that on GitHub written by Justin Abrahms which also prints the hex codes of the colours.

Download the script to current working directory

wget https://gist.githubusercontent.com/justinabrahms/1047767/raw/a79218b6ca8c1c04856968d2d202510a4f7ec215/colortest.py

give it execute permission

chmod +x colortest.py

Run it:

./colortest.py

Here's the script in full in case of link-rot:

#!/usr/bin/env python
# Ported to Python from http://www.vim.org/scripts/script.php?script_id=1349

print "Color indexes should be drawn in bold text of the same color."
print

colored = [0] + [0x5f + 40 * n for n in range(0, 5)]
colored_palette = [
    "%02x/%02x/%02x" % (r, g, b) 
    for r in colored
    for g in colored
    for b in colored
]

grayscale = [0x08 + 10 * n for n in range(0, 24)]
grayscale_palette = [
    "%02x/%02x/%02x" % (a, a, a)
    for a in grayscale 
]

normal = "\033[38;5;%sm" 
bold = "\033[1;38;5;%sm"
reset = "\033[0m"

for (i, color) in enumerate(colored_palette + grayscale_palette, 16):
    index = (bold + "%4s" + reset) % (i, str(i) + ':')
    hex   = (normal + "%s" + reset) % (i, color)
    newline = '\n' if i % 6 == 3 else ''
    print index, hex, newline, 

Solution 3

While not quite a "test pattern", I have xterm-color-chooser:

screenshot

Solution 4

Yet another script, written by me, is located in the VTE repository: https://git.gnome.org/browse/vte/plain/perf/256test.sh?h=vte-0-38.

It requires a window of 120-ish or more columns, but arranges the colors of the 6x6x6 cube nicely and compactly. The first digits of the indices are stripped for compactness, you can easily figure them out. The vertical bars provide you the ability to examine the exact RGB of the foreground color without antialiasing kicking in (as it does at the digits).

The top of the output (not shown in the screenshot below) demonstrates the craziness that goes around with the bold vs. bright ambiguity, namely that the boldness escape sequence combined with one of the legacy 8 colors' escape sequence for the foreground also switches to the bright counterpart color, whereas with the new style (256-color capable) escape sequences this is no longer the case, not even for the first 8 colors. At least that's how xterm and VTE (GNOME Terminal etc.) behave.

This screenshot shows about half of the output:

Output of 256test.sh in GNOME Terminal

Solution 5

Perhaps superfluous but I've written a version that prints the 256 colors using the background with automatic shell width detection so the colors are more easily visible.

https://gist.github.com/WoLpH/8b6f697ecc06318004728b8c0127d9b3

256 color test demo

#!/usr/bin/env python
from __future__ import print_function

import os
import shutil
import subprocess


def get_width(default=80):
    '''Attempt to detect console width and default to 80'''
    try:
        columns, rows = shutil.get_terminal_size()
    except AttributeError:
        try:
            _, columns = subprocess.check_output(['stty', 'size']).split()
        except OSError:
            columns = os.environ.get('COLUMNS', default)

    columns = int(columns) - 77
    # Since we have 6 columns with 1 space on each side, we can increment the
    # size for every 12 extra columns
    return max(0, columns / 12)


# Loosely based on https://gist.github.com/justinabrahms/1047767
colored = [0] + list(range(95, 256, 40))
colored_palette = [
    (r, g, b)
    for r in colored
    for g in colored
    for b in colored
]


grayscale_palette = [(g, g, g) for g in range(8, 240, 10)]


esc = '\033['
# Reset all colors sequence
reset = esc + '0m'
# Regular color
normal = esc + '38;5;{i}m'
# Bold color
bold = esc + '1;' + normal
# Background color
background = esc + '48;5;{i}m'

pattern = (
    '{normal}{background}{padding:^{width}}{i:^3d} '  # pad the background
    '{r:02X}/{g:02X}/{b:02X}'  # show the hex rgb code
    '{padding:^{width}}'  # pad the background on the other side
    '{reset}'  # reset again
)

base_context = dict(reset=reset, padding='', width=get_width())

for i, (r, g, b) in enumerate(colored_palette + grayscale_palette, 16):
    context = dict(i=i, r=r, g=g, b=b, color=r + g + b, **base_context)
    context.update(bold=bold.format(**context))
    context.update(background=background.format(**context))

    # Change text color from black to white when it might become unreadable
    if max(r, g, b) > 0xCC:
        context.update(normal=normal.format(i=0))
    else:
        context.update(normal=normal.format(i=255))

    print(pattern.format(**context), end='')

    # Print newlines when needed
    if i % 6 == 3:
        print()
    else:
        print(' ', end='')
Share:
69,713

Related videos on Youtube

Tom Hale
Author by

Tom Hale

Updated on September 18, 2022

Comments

  • Tom Hale
    Tom Hale over 1 year

    How do I print a 256-colour test pattern in my terminal?

    I want to check that my terminal correctly supports 256 colours.

    • mirabilos
      mirabilos over 7 years
      type /cubes in irssi (source)
  • MadisonCooper
    MadisonCooper over 7 years
    I like your comment on the grayscale on the scripts GitHub page - "#Not 50, but 24 Shades of Grey"
  • Tommaso Thea Cioni
    Tommaso Thea Cioni almost 6 years
    If anyone wants to run this script in a one liner, run curl https://gist.githubusercontent.com/WoLpH/8b6f697ecc063180047‌​28b8c0127d9b3/raw/25‌​0eb2e3f2acca1c51aa52‌​adf611ec0380291e8a/c‌​olortest.py | python3
  • masterxilo
    masterxilo over 5 years
  • masterxilo
    masterxilo over 5 years
    To run terminal-colors, do curl -s https://raw.githubusercontent.com/eikenb/terminal-colors/mas‌​ter/terminal-colors | python
  • masterxilo
    masterxilo over 5 years
    curl -s https://raw.githubusercontent.com/grawity/code/master/term/x‌​term-color-chooser | python3
  • masterxilo
    masterxilo over 5 years
    curl -s -L https://git.gnome.org/browse/vte/plain/perf/256test.sh?h=vte‌​-0-38 | bash
  • masterxilo
    masterxilo over 5 years
    I suggest curl -s https://gist.githubusercontent.com/WoLpH/8b6f697ecc063180047‌​28b8c0127d9b3/raw/co‌​lortest.py | python3
  • Tom Hale
    Tom Hale over 5 years
    @masterxilo what is terminal-colors and how does it compare to the options I suggested?
  • ianstarz
    ianstarz over 5 years
    what would the printf pattern look like for coloring the text instead of the background?
  • Aarav Garg
    Aarav Garg over 2 years
    Or: curl https://gist.githubusercontent.com/justinabrahms/1047767/raw‌​/a79218b6ca8c1c04856‌​968d2d202510a4f7ec21‌​5/colortest.py | python