úloha 034: ASCII art

Úkolem je implementovat transformaci rastrového obrázku na ASCII art. Vstupem je obraz načtený z disku, výstupem text který se podobá vstupnímu obrázku. Jako inspirace poslouží 9 Geeky Pieces Of Ascii Art nebo některý z volně dostupných on-line konvertorů obrázků na ASCII art.

Základem poslouží projekt 034ascii z repository grcis. Je připravena jednoduchá aplikace, ve které uživatel zadává vstupní obrázek a po stisku tlačítka "Engage!" se spouští metoda AsciiArt.Process() přepočítávající obrázek do výstupu. Tuto metodu musíte přeprogramovat, příslušný úsek kódu je ve zdrojáku AsciiArt.cs označen závorkami:

  // !!!{{
  // !!!}}

Náměty: základní řešení používá jen pixely zdrojového obrázku v každém (source width / destination width)-em sloupci a (source height / destination height)-em řádku, tím se ztrácejí informace z originálu. Můžete implementovat filtrování, které zohlední všechny pixely zdroje. Kostra řešení také generuje výstup jen ve 2 úrovních (mezera nebo #), výsledek bude vypadat lépe s více úrovněmi. Vážnejší zájemci mohou zkusit detekci hran (např. Sobel operator - Wikipedia) vstupného obrázku a vkládat znaky podle směru hran (např. lomítka, pomlčky a svislítka) nebo počítat "pokrytí" jednotlivých symbolů z fontu a automaticky kalibrovat prahy pro různé znaky.

Technicky: Metoda AsciiArt.Process() dostává jako vstup Bitmap src s vstupním obrázkem a parametry int width a int height které určují počet sloupců a řádků výstupního textu. Metoda vrací jako výstup text ASCII-art obrázku. Pokud potřebujete změnit font náhledu výstupu, můžete přepsat metodu AsciiArt.GetFont().
Z hlavního formuláře se předává textový parametr, přes který je možné případně modifikovat nějaké další parametry Vašeho algoritmu. Pokud tuto možnost využijete, připište mi stručný návod!

Předpokládá se černý text na bílém pozadí a použití neproporcionálního fontu (všechny symboly jsou stejne široké). Pokud budete definovat vlastní font, použite některý rozumný (Wingdings a podobné obrázkové fonty nejsou přípustné), omezte se na neproporcionální fonty (Courier New, Lucida Console, Consolas...).

Efektivnější práce s jednotlivými pixely: pokročilejší programátoři mohou místo málo efektivního přístupu po pixelech použít metody Bitmap.LockBits() a Bitmap.UnlockBits() a jednotlivé pixely si sami adresovat pomocí ukazatelu (v "unsafe" bloku kódu!).

Příklad rastrového obrázku a ASCII-art výstupu:
bird ASCII-art

BODOVÁNÍ: více úrovní jasu .. až 7 bodů, filtrace vstupu .. 3 body, zohlednění gradientu (směrovost, hrany) .. 4 body (dohromady až 14 bodů) + bonusy

TERMÍN: do 24. 11. 2013

PROJEKT: 034ascii

ZDROJOVÝ SOUBOR: AsciiArt.cs


[Cvičení NPGR003]  [Návody k zápočtům v C#]  [Přednášky a semináře]  [Odkazy na demonstrace]

Valid XHTML 1.1 Copyright (C) 2011-2013 J.Pelikán, last change: $Date: 2014-10-03 15:44:39 +0200 (Fri, 03 Oct 2014) $
Send comments/requests to pepca.at.cgg.mff.cuni.cz