Článek s na první pohled šíleným a nesrozumitelným názvem – (opakovat už ho nebudu ;-)) – je další z řady mých programů v jazyce C. Ano, opravdu jsem si napsal vlastní ASCII Art generátor. Cesta k němu byla ale dlouhá.
Co je to ASCII Art
ASCII Art je, no, ale asi ano, umělecký proud, zabývající se především výtvarnou tvorbou použitím znaků (ASCII znaků). Česky řečeno je to taková mozaika z písmenek, která při dostatečném množství znaků v obrázku působí velmi realisticky. ASCII Art generátor je pak pochopitelně program, který převádí z obrázku na text- ASCII Art.
ASCII generátorů je plno online, nebo i ke stažení, placených, shareware, demo a podobně. Ale nevěděl jsem o tom, že by nějaký existoval na linux. Teď už určitě aspoň jeden existuje ;-).
Jak jsem se já dostal k Ascii Art

Znáte Projekt AA? To se čtveřice linuxáků (pokud vím, tak z Brna) dala do hromady a napsala grafickou knihovnu AA. Ukázkové video BB Demo, nám pustil ve třeťáku na střední pan Ing. Nožka. Já, jelikož jsem tou dobou pracoval na kampani Drag Race, kde se několik málo ASCII obrázků vyskytuje, jsem se o to začal zajímat.
V prváku na vysoké, jsem se dal do diskuze s jedním kamarádem, zarytým linuxákem o tom, jestli neznám nějaký způsob, jak zobrazovat obraz v textovém režimu. Kromě AA padly úvahy i na ASCII Art. Zatímco kamarád to zabalil po nastudování struktury PNG souboru, já jsem na to šel od lesa.

Hodil jsem do googlu formát BMP- Windows BitMap a dostal jsem se na článek Grafický formát BMP – používaný a přitom neoblíbený. Zde je celá bitmapa rozebrána do posledního Bytu a tak u nebyl problém s jeho pomocí začít něco kutit ve vimu (resp. samozřejmě v C-write ‚n‘ run). Ve snaze vytvořit si struktury pro jednotlivé hlavičky, do nich nahrát data a ta posléze zpracovat takovým způsobem, že bych to publikoval jako hlavičkový soubor bitmap.h, který by měl univerzální použití (vykreslení bitmapy jako ASCII by byla jen jedna z několika funkcí) však selhala.
Tak jsem se vykašlal na struktury a začal psát program s příznačným názvem „fast-bitmap-load.c“. Ten prostě posbíral potřebné informace o bitmapě a vykreslil ji. Tečka hotovo. Zabralo mi to asi týden (no jo, když člověk nemá zkušenosti, tak by při 20. pohledu na Segmentation fault něčím opravdu mrštil o zem) a má to v uvozovkách pouhých 283 řádků. Včetně nápovědy a kontrol všeho možného (viz dále).

Jak to funguje
Stručně:
- Načte název souboru a je-li zadána tak i škálu znaků, ze kterých se má obrázek vykreslit („gradient“).
- Soubor otevře nebo skončí chybou.
- Ověří z metadat, jestli se jedná opravdu o BitMapu.
- Zkontroluje, jestli se nepoužívá komprese.
- Zjistí bitovou hloubku. Program podporuje pouze bitové hloubky 24/32 bitů/pixel (osmibitové RGB a RGBA).
- Získá začátek a „konec“ samotných obrazových dat.
- Vytáhne rozlišení obrázku (šířku a výšku v pixelech).
- Do dvojrozměrného pole nahraje odbarvený obrázek. (ve verzi 1.2 nejdříve nahraje, poté odbarví a následně změní velikost)
- Obrázek jednoduše vytiskne – 1 znak na 1 pixel.
Jak na to
V případě pochybností nebo jiných problémů je program samozřejmě vybaven nápovědou, kterou zavoláte standartně
1 2 |
mascaag --help mascaag -h |
Jak jsem psal, výstup, tedy vytvořený ASCII obrázek můžete uložit do souboru. Není v tom žádná věda, prostě jeho standartní výstup přesměrujete do požadovaného souboru:
1 |
mascaag bitmapa.bmp > bitmapa.txt |
Jak na to s použitím původní verze 1.0
Začneme obrázkem. Najdeme si tedy nějaký vhodný (bitmapa to být nemusí, stejně jej budeme muset upravovat) a jako správný linuxák vám doporučím otevřít si jej v Gimpu. Následně totiž obrázek, obzvláště pokud je to nějaká fotka, vezmeme a je více než vhodné pohrát si s jasem a kontrastem (i když to by šlo kompenzovat použitím jiného řetězce gradientu). Také bych vám doporučil obrázek mírně roztáhnout – obrazový pixel má přece jen rozměry 1×1 jednotka (pixel), zatímco obvyklé neproporcionální písmo má obvykle 5×8 jednotek na jeden znak, tedy ne ve stejném poměru. Ideální je tedy obrázek roztáhnout do šířky 1,6 krát nebo stlačit výšku na přibližně 0,6.
Pokud nechcete výstup ukládat do souboru (viz níže), je vhodné přizpůsobit mu šířku. Většina výchozích konzolí má 80×25 znaků, tedy obrázek by minimálně tuto šířku měl dodržet. U maximalizovaného terminálu jsou rozměry terminálu přibližně 170×47 znaků.
Obrázek uložíme jako bitmapu a přejdeme k samotnému vykreslení. Program byl tvořen na linuxu a tak se drží jeho koncepce. To znamená, že překreslení obrázku uděláte tak, že program spustíte v konzoli s parametry. Prvním je název souboru bitmapy, druhým, nepovinným je gradient, který chcete použít. Například tedy
1 2 3 |
$ mascaag bitmapa.bmp $ mascaag bitmapa.bmp " .,-+!*$§%@#" $ mascaag bitmapa.bmp " #" |
Nezdá-li se řetězec gradientu, volí se výchozí, .-xdOM#(první případ). Čím více znaků gradientu zadáte, tím čistější budou přechody mezi různými barvami a tím realističtější obrázek bude (druhý případ). Naopak, jak je vidět na třetím příkladu, použitím jen 2 znaků získáte obraz jen dvoubarevný (jakoby doslova černobílý).
Jak na to s novou verzí 1.2
Zde vás odsměruji na nápovědu, tedy přepínače -h|--help . Tam je vše celkem důkladně popsáno a už se mi to nechce popisovat znovu.
Poznámka pro nezkušené linuxáky
Předchozí zápisy budou fungovat jen tehdy, pokud máte mascaag v některé složce uložené v proměnné $PATH. V ostatních případech musíte volat program s celou cestou, tedy absolutně ( /home/uzivatel/mascaag), relativně od domovského adresáře ( ~/mascaag) nebo relativně od aktuálního adresáře ( ./mascaag).
Nová verze, mascaag 1.2
Hned z několika důvodů jsem se rozhodl původní mascaag upravit a rozíšřit. Refactoroval jsem značnou část, zavedl trošku „objektovější“ a strukturovanější přístup a dodal pár dalších funkcí. Mezi ně patří:
- možnost invertovat barvy
- možnost, zvolit si které barevné kanály chcete pro zobrazení použít (R,G,B nebo jen alfu)
- možnost změny počtu pixelů na jeden znak
Generátor je tak sice trošku pomalejší (u velikých bitmap si pár set milisekund počkáte), ale získané možnosti budou jistě velmi praktické. Ušetří tak hodně práce, které by jste jinak zbytečně promrhali nad grafickým editorem.
Bohužel kód tak ztratil na jednoduchosti, která byla předchozí verzi základem, takže se moc nehodí ke studiu práce s bitmapami. Z tohoto důvodu nechám původní verzi stále uvolněnou.
Stažení / Instalace mascaag
Mascaag je Open-source multiplatformní projekt, takže zde předkládám de facto pouze a jen zdrojový kód. Pokud se vám jej, milí linuxáci, nechce kompilovat ručně, mám tu pro vás připravený váš oblíbený instalátor. Stačí kliknout na odkaz níže, stáhnout instalační skript, nastavit mu práva spustit jej – například takto:
1 2 3 |
$ cd Downloady ~/Downloady$ chmod 755 install_mascaag2.sh ~/Downloady$ ./install_mascaag2.sh |
Instalátor má i nějaké drobné možnosti konfigurace, vizte jeho nápovědu (fungují opět obě varianty):
1 2 |
./install_mascaag2.sh --help ./install_mascaag2.sh -h |
Samoinstalátor pro Linux
Stažení ZIP archivu se zdrojovým kódem
původní mascaag 1.0: samoinstalátor – zdrojové kódy