Sixelpack

reinhard@finalmedia.de Wed 25 Dec 2024 12:22:45 PM CET

Du brauchst ein Terminal, das Sixels unterstützt. z.B. xterm. Eine Liste findest du unter https://www.arewesixelyet.com/: bobcat, contour, ctxterminal, darktile, iterm2, konsole, macterm, mintty, mlterm, tmux, yaft, toyterm, visualstudio code

Zum Test musst du Sixel Unterstützung an deinem Terminal aber aktivieren. Im Falle von xterm mittels dem Parameter "-ti vt340":


xterm -bg black -fg white -ti vt340

Und in diesem Terminal kannst du nun auch Grafiken darstellen, sobald ein beliebiger Prozess die passenden Sixel Escape Sequenzen auf stdout schreibt. Hier z.B.:

curl -s https://finalmedia.de/presse/finalmedia_logo.sixel

Was sind Sixel?

Kurz und Knapp: Vor langer langer Zeit (Once Upon a Time)... Wir arbeiten auf den globigen DEC VT Terminals der 1970er und 1980er Jahre. Wir schreiben 1987 und haben ein DEC VT340 Terminal mit einer Intel 8031 CPU und wir hätten neben den ASCII Zeichen die wir ausgeben können, auch gerne Grafiken sehen können. Escape Sequenzen, um farbige Ausgaben zu erzeugen haben wir schon. Und DEC entwickelt nun etwas, mit dem ebenso mit Escape Sequenzen auch Pixelgrafiken ausgegeben werden können: Mit dem Protokoll Sixel können wir nun eine Rastergrafik/Foto in 6er Blöcken (6 Pixel hoch und 1 Pixel breit) zusammenfassen und diese in ASCII Characters als Sequenzen komprimiert hinterlegen. Damit sind 256 farbige Grafiken möglich. Das Terminal stellt diese dann Zeile für Zeile und passend gerastert als echte Rastergrafik/Pixel dar.

Details:


echo -e "\ePq" > demo.sixel
cat << ::EOF:: >> demo.sixel
#0;2;0;0;0#1;2;100;100;0#2;2;0;100;0
#5~~@@vv@@~~@@~~$
#8??}}GG}}??}}??-
#15!120@
::EOF::
echo -e "\e\\" >> demo.sixel
echo;cat demo.sixel;echo;

In diesem Fall verwenden wir 16 Standardfarben, mit der # eingeleitet. die #15 ist grau und !120@ zeichnet uns die horizontale Linie.

Warum nutzt man den alten Kram noch?

Old School Vermächtnis und Kompatiblität. Hättest du wirklich noch ein altes VT340 Terminal irgendwo rumstehen, kannst du damit auch heute noch Grafiken sehen.

Außerdem kannst du somit mit jeder beliebigen Programmiersprache auch Grafikausgabe erzeugen.

Alternative dazu sind netpbm Grafikformate, die noch simpler aufgebaut sind.

Da es auch Konverter gibt, kannst du natürlich auch sixel zu netpbm konvertieren etc. Und natürlich gibt es auch Nadeldrucker, die dieses alte Format sprechen. Übrigens auch mit ein Grund, warum es genau 6 Pixel sind, weil es den 6 Nadeln eines Druckkopfs zu damaliger Zeit entspricht.

Ist Sixel toll?

Naja, der von DEC geschaffene Standard ist nicht so besonders ;)

hässlich, schlecht lesbar. Zwingend als Escape Sequenz und neben den # und ; } ? @ ! chars auch CRLF.

Was geht sonst noch so?

gnuplot hat auch sixel Unterstützung. Zumindest aktuellere Versionen.

 gnuplot -e "set term sixelgd truec; test palette"

Auch Animationen sind möglich. img2sixel nennt sich die passende Applikation.

Was gibts noch in diese Richtung?

ReGIS, dann Vektorgrafiken statt Rastergrafiken, erschien in etwa zur gleichen Zei auf den Terminals des DEC VT Serie.

Wie kann ich selbst welche erzeugen?

z.B. mit dem Paket imagemagick. Nehmen wir an du hast eine png Datei namens dateidatei.png und willst diese nun konvertierten:

apt-get install imagemagick
convert deinedatei.png -colors 16 dateidatei.sixel
cat dateidatei.sixel

Tipp: Du kannst imagemagick auch direkt als Viewer verwenden, indem du die Ausgabe auf stdout leitest. In dieser Form:

convert dateidatei.png -colors 64 sixel:-

Natürlich kannst du dabei auch gleich passend skalieren:

convert dateidatei.png -resize 400x -colors 256 sixel:-

Das ist ganz praktisch, wenn du aus der Ferne via SSH auf deinem Terminal eine Grafik sehen willst.