Terminál, přesněji řečeno emulátor terminálu, jistě všichni znáte. Víte nejspíš, že umí barvy, ale kdo z vás ví, že jich neumí jen 16, ale rovnou 256? Ale přesto, že má "tolik" barev (Xka vám jich nabízej 16777216, z toho 256 odstínů šedi), neumí grafiku, jen text. A když už se naskytne nějakej "prohlížeč obrázků" pro terminál, vypadá to dost blbě, protože se obrázek zobrazuje pomocí ASCII znaků, což sice obrázek připomíná, ale vypadá to zblízka jako písmenková polívka. A nehledě na to, že tohle bylo dělaný jen pro určitej typ písma s určitou velikostí, takže při změně fontu maj znaky jinej jas, než autor prohlížeče požadoval, takže to vypadá ještě hůř, než se čekalo.
Ale my jsme na to šli jinak. Napsal jsem takovou malou demonstraci toho, že i terminál může zobrazovat grafiku docela na úrovni. Je to sice pomalý, černobílý, rozlišení je závislý na velikosti okna terminálu a rozměrech znaku, ale podporuje to spoustu grafickejch formátů, výstup se dá uložit pro pozdější mnohem rychlejší zobrazení, dá se použít pro slideshow a umí to až 153 odstínů šedi. Pro použití je potřeba akorát doinstalovat ImageMagick.
Program se skládá ze 2 částí, z konvertoru a konvertoru-zobrazovače.
Nejdřív se obrázek upraví pomocí ImageMagick na požadovaný rozměry, v případě potřeby se přidaj kvůli centrování okraje a uloží do nekomprimovanýho formátu PGM. To je krásně čitelnej formát pro černobílou bimapovou grafiku, kde každej pixel je reprezentován numerickou hodnotou, tady v intervalu 0-255 (černá-bílá).
Následuje konvertor-zobrazovač, kterej čte data z onoho PGM obrázku, hodnoty decimuje na až 153 úrovní z až 256 úrovní na vstupu, ke každý z nich přidá barvu pomocí escape sekvence, výsledek se pak zobrazí. Terminál umí bezpečně 26 úrovní šedi (+ další 2, který se ovšem zobrazujou v různých terminálech jinak) na popředí i na pozadí, zbytek se míchá rozdílnou barvou popředí i pozadí, za použití trojice zvláštních znaků: ▓ (75%popředí, 25% pozadí), ▒ (50% popředí, 50% pozadí) a ░ (25% popředí, 75% pozadí). Byly nově přidány i 2 dodatkový znaky z Braillova písma pro eliminaci ostrých přechodů.
Takhle to vypadá:
To velký je Xterm, to malý terminál. Kliknutím na obrázek se načte v plný velikosti.... a tady je kód (aktualizováno):
#!/bin/bash
O="/tmp/tmp.pgm"
R=`tput cols`x`tput lines`
## Jestli to není obrázek, nebo jestli soubor neexistuje, tak se ukonči
if [ ! -f $1 ]
then exit
elif grep -q image <<<`file $1`
then
## Schová kurzor
echo -ne "\e[?25l"
## Pro zrychlení: zmenší/zvětší obrázek podle jeho rozměrů tak, aby se velký obrázky
## zpracovávaly rychlejc, ale aby malý obrázky pokud možno neutrpěly ztrátu detailů
## U je relativní k vejšce znaku, V zase k šířce (v tomhle případě 5×8px), W je filtr.
## Je to narychlo a baj vočko udělaná prasečina, ale kupodivu funguje.
PIX=$((`identify $1 | awk '{print $3}' | sed -e 's/x/*(/g;s/$/\/2\)\/500/g'`))
if [ $PIX -le 10 ]
then U=640; V=400; W="sincfast"
elif [ $PIX -le 100 ]
then U=320; V=200; W="box"
elif [ $PIX -le 500 ]
then U=160; V=100; W="box"
elif [ $PIX -le 1000 ]
then U=80; V=50; W="box"
elif [ $PIX -le 5000 ]
then U=40; V=25; W="box"
elif [ $PIX -le 10000 ]
then U=16; V=10; W="box"
elif [ $PIX -le 20000 ]
then U=8; V=5; W="box"
elif [ $PIX -gt 20000 ]
then U=4; V=2.5; W="box"
fi
## Nastavení správných rozměrů, konverze do PGM
convert \
-comment img2term \
$1 \
-filter $W \
-resize $U%x$V \
-filter Triangle \
-resize $R \
-gamma 2 \
-background black \
-gravity center \
-extent $R \
-depth 8 \
-compress none \
$O
tput cup 0 0
## Načtení dat z PGM obrázku, přeformátování na takovej počet sloupců, jako má terminál,
## decimace barevný palety, aby se 256 odstínů vešlo do 153 odstínů, vykreslení
echo -ne "$(cat $O | tail -n $((`cat $O | wc -l`-4)) | xargs -n `cat $O | sed -n 3p | awk '{print $1}'` | sed -e '
s/$/ /g;
s/255 /\\e[107m /g;
s/254 /\\e[107;38;5;255m⡈/g;
s/25[23] /\\e[107;38;5;255m⡪/g;
s/25[01] /\\e[107;38;5;255m░/g;
s/24[7-9] /\\e[107;38;5;255m▒/g;
s/24[56] /\\e[107;38;5;255m▓/g;
s/24[34] /\\e[97;48;5;255m⡪/g;
s/24[0-2] /\\e[48;5;255m /g;
s/239 /\\e[48;5;255;38;5;254m⡪/g;
s/23[78] /\\e[48;5;255;38;5;254m░/g;
s/23[56] /\\e[48;5;255;38;5;254m▒/g;
s/23[34] /\\e[48;5;255;38;5;254m▓/g;
s/232 /\\e[38;5;255;48;5;254m⡪/g;
s/23[01] /\\e[48;5;254m /g;
s/229 /\\e[48;5;254;38;5;253m⡪/g;
s/22[78] /\\e[48;5;254;38;5;253m░/g;
s/22[56] /\\e[48;5;254;38;5;253m▒/g;
s/22[34] /\\e[48;5;254;38;5;253m▓/g;
s/222 /\\e[38;5;254;48;5;253m⡪/g;
s/22[01] /\\e[48;5;253m /g;
s/219 /\\e[48;5;253;38;5;252m⡪/g;
s/21[78] /\\e[48;5;253;38;5;252m░/g;
s/21[56] /\\e[48;5;253;38;5;252m▒/g;
s/21[34] /\\e[48;5;253;38;5;252m▓/g;
s/212 /\\e[38;5;253;48;5;252m⡪/g;
s/21[01] /\\e[48;5;252m /g;
s/209 /\\e[48;5;252;38;5;251m⡪/g;
s/20[78] /\\e[48;5;252;38;5;251m░/g;
s/20[56] /\\e[48;5;252;38;5;251m▒/g;
s/20[34] /\\e[48;5;252;38;5;251m▓/g;
s/202 /\\e[38;5;252;48;5;251m⡪/g;
s/20[01] /\\e[48;5;251m /g;
s/199 /\\e[48;5;251;38;5;250m⡪/g;
s/19[78] /\\e[48;5;251;38;5;250m░/g;
s/19[56] /\\e[48;5;251;38;5;250m▒/g;
s/19[34] /\\e[48;5;251;38;5;250m▓/g;
s/192 /\\e[38;5;251;48;5;250m⡪/g;
s/19[01] /\\e[48;5;250m /g;
s/189 /\\e[48;5;250;38;5;249m⡪/g;
s/18[78] /\\e[48;5;250;38;5;249m░/g;
s/18[56] /\\e[48;5;250;38;5;249m▒/g;
s/18[34] /\\e[48;5;250;38;5;249m▓/g;
s/182 /\\e[38;5;250;48;5;249m⡪/g;
s/18[01] /\\e[48;5;249m /g;
s/179 /\\e[48;5;249;38;5;248m⡪/g;
s/17[78] /\\e[48;5;249;38;5;248m░/g;
s/17[56] /\\e[48;5;249;38;5;248m▒/g;
s/17[34] /\\e[48;5;249;38;5;248m▓/g;
s/172 /\\e[38;5;249;48;5;248m⡪/g;
s/17[01] /\\e[48;5;248m /g;
s/169 /\\e[48;5;248;38;5;247m⡪/g;
s/16[78] /\\e[48;5;248;38;5;247m░/g;
s/16[56] /\\e[48;5;248;38;5;247m▒/g;
s/16[34] /\\e[48;5;248;38;5;247m▓/g;
s/162 /\\e[38;5;248;48;5;247m⡪/g;
s/16[01] /\\e[48;5;247m /g;
s/159 /\\e[48;5;247;38;5;246m⡪/g;
s/15[78] /\\e[48;5;247;38;5;246m░/g;
s/15[56] /\\e[48;5;247;38;5;246m▒/g;
s/15[34] /\\e[48;5;247;38;5;246m▓/g;
s/152 /\\e[38;5;247;48;5;246m⡪/g;
s/15[01] /\\e[48;5;246m /g;
s/149 /\\e[48;5;246;38;5;245m⡪/g;
s/14[78] /\\e[48;5;246;38;5;245m░/g;
s/14[56] /\\e[48;5;246;38;5;245m▒/g;
s/14[34] /\\e[48;5;246;38;5;245m▓/g;
s/142 /\\e[38;5;246;48;5;245m⡪/g;
s/14[01] /\\e[48;5;245m /g;
s/139 /\\e[48;5;245;38;5;244m⡪/g;
s/13[78] /\\e[48;5;245;38;5;244m░/g;
s/13[56] /\\e[48;5;245;38;5;244m▒/g;
s/13[34] /\\e[48;5;245;38;5;244m▓/g;
s/132 /\\e[38;5;245;48;5;244m⡪/g;
s/13[01] /\\e[48;5;244m /g;
s/129 /\\e[48;5;244;38;5;243m⡪/g;
s/12[78] /\\e[48;5;244;38;5;243m░/g;
s/12[56] /\\e[48;5;244;38;5;243m▒/g;
s/12[34] /\\e[48;5;244;38;5;243m▓/g;
s/122 /\\e[38;5;244;48;5;243m⡪/g;
s/12[01] /\\e[48;5;243m /g;
s/119 /\\e[48;5;243;38;5;242m⡪/g;
s/11[78] /\\e[48;5;243;38;5;242m░/g;
s/11[56] /\\e[48;5;243;38;5;242m▒/g;
s/11[34] /\\e[48;5;243;38;5;242m▓/g;
s/112 /\\e[38;5;243;48;5;242m⡪/g;
s/11[01] /\\e[48;5;242m /g;
s/109 /\\e[48;5;242;38;5;241m⡪/g;
s/10[78] /\\e[48;5;242;38;5;241m░/g;
s/10[56] /\\e[48;5;242;38;5;241m▒/g;
s/10[34] /\\e[48;5;242;38;5;241m▓/g;
s/102 /\\e[38;5;242;48;5;241m⡪/g;
s/10[01] /\\e[48;5;241m /g;
s/99 /\\e[48;5;241;38;5;240m⡪/g;
s/9[78] /\\e[48;5;241;38;5;240m░/g;
s/9[56] /\\e[48;5;241;38;5;240m▒/g;
s/9[34] /\\e[48;5;241;38;5;240m▓/g;
s/92 /\\e[38;5;241;48;5;240m⡪/g;
s/9[01] /\\e[48;5;240m /g;
s/89 /\\e[48;5;240;38;5;239m⡪/g;
s/8[78] /\\e[48;5;240;38;5;239m░/g;
s/8[56] /\\e[48;5;240;38;5;239m▒/g;
s/8[34] /\\e[48;5;240;38;5;239m▓/g;
s/82 /\\e[38;5;240;48;5;239m⡪/g;
s/8[01] /\\e[48;5;239m /g;
s/79 /\\e[48;5;239;38;5;238m⡪/g;
s/7[78] /\\e[48;5;239;38;5;238m░/g;
s/7[56] /\\e[48;5;239;38;5;238m▒/g;
s/7[34] /\\e[48;5;239;38;5;238m▓/g;
s/72 /\\e[38;5;239;48;5;238m⡪/g;
s/7[01] /\\e[48;5;238m /g;
s/69 /\\e[48;5;238;38;5;237m⡪/g;
s/6[78] /\\e[48;5;238;38;5;237m░/g;
s/6[56] /\\e[48;5;238;38;5;237m▒/g;
s/6[34] /\\e[48;5;238;38;5;237m▓/g;
s/62 /\\e[38;5;238;48;5;237m⡪/g;
s/6[01] /\\e[48;5;237m /g;
s/59 /\\e[48;5;237;38;5;236m⡪/g;
s/5[78] /\\e[48;5;237;38;5;236m░/g;
s/5[56] /\\e[48;5;237;38;5;236m▒/g;
s/5[34] /\\e[48;5;237;38;5;236m▓/g;
s/52 /\\e[38;5;237;48;5;236m⡪/g;
s/5[01] /\\e[48;5;236m /g;
s/49 /\\e[48;5;236;38;5;235m⡪/g;
s/4[78] /\\e[48;5;236;38;5;235m░/g;
s/4[56] /\\e[48;5;236;38;5;235m▒/g;
s/4[34] /\\e[48;5;236;38;5;235m▓/g;
s/42 /\\e[38;5;236;48;5;235m⡪/g;
s/4[0-1] /\\e[48;5;235m /g;
s/39 /\\e[48;5;235;38;5;234m⡪/g;
s/3[78] /\\e[48;5;235;38;5;234m░/g;
s/3[56] /\\e[48;5;235;38;5;234m▒/g;
s/3[34] /\\e[48;5;235;38;5;234m▓/g;
s/32 /\\e[38;5;235;48;5;234m⡪/g;
s/3[01] /\\e[48;5;234m /g;
s/29 /\\e[48;5;234;38;5;233m⡪/g;
s/2[78] /\\e[48;5;234;38;5;233m░/g;
s/2[56] /\\e[48;5;234;38;5;233m▒/g;
s/2[34] /\\e[48;5;234;38;5;233m▓/g;
s/22 /\\e[38;5;234;48;5;233m⡪/g;
s/2[01] /\\e[48;5;233m /g;
s/19 /\\e[48;5;233;38;5;232m⡪/g;
s/1[78] /\\e[48;5;233;38;5;232m░/g;
s/1[56] /\\e[48;5;233;38;5;232m▒/g;
s/1[34] /\\e[48;5;233;38;5;232m▓/g;
s/12 /\\e[38;5;233;48;5;232m⡪/g;
s/1[01] /\\e[48;5;232m /g;
s/9 /\\e[48;5;232;38;5;0m⡪/g;
s/[78] /\\e[48;5;232;30m░/g;
s/[56] /\\e[48;5;232;30m▒/g;
s/[34] /\\e[48;5;232;30m▓/g;
s/2 /\\e[38;5;232;40m⡪/g;
s/1 /\\e[38;5;232;40m⡈/g;
s/0 /\\e[40m /g')\e[00m"
tput cup `tput lines` 0
## Informace o obrázku vlevo dole
echo -ne "\e[38;5;228;48;5;22m `identify $1|awk '{print $1, "\e[38;5;22;48;5;228m", $3, "\b,", $7}'` \e[00m"
tput cup `tput lines` `tput cols`
echo -ne "\e[?12l\e[?25h"
else exit
fi
tput cup 0 0
Uložte to do souboru třeba
blablabla.sh, nastavte mu spustitelnej příznak (chmod +x soubor) a spusťte
/cesta/k/blablabla.sh obrázek.pngPro spuštění slideshow:
cd /cesta/ke/složce_obrázků/
for X in `ls .`; do /cesta/k/blablabla.sh $X; sleep 5; doneU pomalejších počítačů se může
sleep 5; vypustit, ta pětka jinak znamená čekat 5s
P. S.:
*Nefunguje v konzoli. Ta většinou neumí ani použitý escape sekvence, natož 256 barev.
*Lepší použít jako terminál Xterm- má rychlejší vykreslování a dá se dát do plnýho fullscreenu, aniž by tam vadilo menu
*Výstup se dá přesměrovat do souboru, kterej se dá potom zobrazit třeba pomocí
cat. Např.
blablabla.sh obrázek.jpg > obrázek.txt, pro zobrazení pak
cat obrázek.txt. Bacha ale na velikost okna!