Rastry
Jak již bylo řečeno, určité typy půltónování – rastry – jsou řízeny zvláštní konstantou – frekvencí rastru.
Při návrhu rastru je nutné brát na jedné straně v úvahu schopnost lidského oka rastr rozlišit, na druhé straně pak možnosti zařízení rastr vytvořit. Hrubé rastry lze tisknout velmi přesně, ale na druhou stranu ruší čtenáře, a naopak.
Rastry do 50 LPI jsou dobře patrné i z běžné čtecí vzdálenosti. Používají se např. u faxů, nejjednodušších tiskáren, ale také na billboardech (u nichž je „běžná čtecí vzdálenost“ přece jen větší).
Rastry mezi 80 a 110 LPI jsou z běžné čtecí vzdálenosti již skoro neviditelné. Používají se k tisku levných tiskovin (např. novin). Jejich tisk zvládnou běžné počítačové tiskárny a lze je dobře vytisknout z fólií a dokonce i pauzovacích papírů.
Rastry 120–140 LPI jsou běžně používány pro ofsetový tisk na nehlazený papír.
Rastry 150–175 LPI se používají při běžném ofsetovém tisku na hlazený a křídový papír. Pro lidi s dobrým zrakem jsou viditelné pouze z těsné blízkosti.
Nejmodernější technologie, jakou je např. bezvodý ofsetový tisk, používají rastry 200–300 LPI. Ty jsou viditelné jen s lupou.
Většina technologií tisku a typů papíru má jistou horní mez frekvence rastru, za kterou kvalita prudce klesá. Např. u běžné laserové tiskárny je rastr 106 LPI velmi pravidelný (zvlášť na fólii), ale při rastru 141 LPI se na jednobarevných podkladech objevují mapy, vznikající nestejnoměrnými podmínkami uvnitř tiskárny. Přesto však někteří výrobci nových laserových tiskáren s rozlišením 1 200 DPI vnucují svým zařízením dokonce frekvenci 170 LPI! S tímto rastrem nelze na nehlazeném papíře dosáhnout dobrých výsledků a pouhé snížení frekvence na 121 LPI rovnoměrnost viditelně zvýší.
Úhel rastru
Další důležitou veličinou, o které jsme se doposud nezmínili, je úhel rastru. Je to úhel, který určuje sklon rastru vůči jeho standardní poloze. U symetrických rastrů mají smysl hodnoty mezi 0° a 90°. Úhel rastru též ovlivňuje velikost buňky pole prahů (viz minulý díl), na které se rastr při zpracování převádí. Jeho správné nastavení se odvozuje od fyziologie lidského oka a u barevného tisku též od harmonického skládání rastrů.
Při barevném tisku musí být úhly pro různé barvy odlišné, jinak by přesnost soutisku musela být téměř nekonečná, aby kapky barvy neležely v zákrytu na sobě. Takto leží v polozákrytu, nebereme-li v úvahu drobné nepřesnosti tisku.
Nejméně rušivé jsou rastry kolem úhlu 45°, které se proto používají pro černobílý tisk nejčastěji. Naopak nejvíce ruší rastry s úhlem kolem 0° (a 90°), proto se používají v barevném tisku pro žlutou.
K harmonickému složení více rastrů dojde tehdy, jsou-li velikosti jim příslušejících polí prahů v poměru malých celých čísel. Pokud tomu tak není, objeví se při tisku neodstranitelné moiré.
Příklad: Dva rastry se složí harmonicky, mají-li stejnou frekvenci a rozdíl mezi jejich úhly je 45° nebo 30°. Pokud bychom zvolili 15°, vznikne moiré. Harmonickému složení rastru lze též napomoci různými frekvencemi pro různé barvy.
Omezení počtu šedí (vztah rozlišení, frekvencí rastru a úhlu)
Mezi výstupním rozlišením, frekvencí rastru a úhlem existuje vztah, který určuje, kolik přechodových barev lze pomocí takového rastru vytvořit.
Tento počet je:
počet barev = (r/f)2+1,
kde r je rozlišení a f je frekvence rastru.
Další omezení se týká použitelných frekvencí při daném úhlu rastru. Opět platí pravidlo poměru malých celých čísel mezi rastrem a sítí pixelů, tentokrát z důvodu proveditelnosti výpočtu. Zájemce odkazuji na popis ve zdrojovém kódu Ghostscriptu (soubor gshtscr.c).
Příklad: Máme běžnou laserovou tiskárnu s rozlišením 600 DPI. Tiskneme starší verzí Ghostscriptu, která pro tuto tiskárnu implicitně zvolí frekvenci 106 LPI a úhel 45°. Počet dosažitelných odstínů bude 33. Chceme-li rastr zjemnit, další možnou frekvencí bude 141 LPI. Při ní získáme již jen 19 odstínů. Chceme-li naopak zvýšit počet odstínů, můžeme snížit rastr třeba na 85 LPI, a tím dosáhnout 51 odstínů.
Je vidět, že se jedná o poměrně značné omezení. Jak z toho ven? Jednou z možností je výběr vyššího rozlišení. Pokud takovou možnost nemáme, přijde vhod vytváření superbuněk z více základních rastrových buněk.
Fyzikální a digitální frekvence rastru
Možná vás překvapí, že tyto dvě hodnoty se mohou lišit. Vysvětlení je poměrně jednoduché. Zatímco digitální frekvence rastru (a tím i počet dosažitelných odstínů) je dána velikostí rastrové buňky, fyzikální frekvence rastru je dána též počtem tiskových bodů (teček) v jedné takové buňce. Pokud používáme běžný rastr a PostScript Level 1 nebo 2, obě frekvence jsou shodné. V případě PostScriptu LL3 skládá interpretr více buněk dohromady, čímž lze dosáhnout vyššího počtu barev. Velikost této superbuňky ovlivňuje parametr MaxSuperScreen. Podobného efektu lze dosáhnout i v nižších verzích PostScriptu vytvořením speciálního rastru.
Zatímco počet barev je v případě superbuněk určen digitální frekvencí rastru, jeho fyzikální vlastnosti (viditelnost pouhým okem či přenosová funkce) jsou určeny převážně fyzikální frekvencí rastru. Daní za toto vylepšení je místy viditelné střídání teček různé velikosti. Celkový dojem z výtisku je však výrazně lepší.
Překvapilo mne, že tato funkce je v Ghostscriptu již delší dobu naimplementována, bohužel však s chybou, která ji pro běžná nastavení deaktivuje. Chybové hlášení jsem právě napsal, takže možná již zítra budeme tisknout lépe bez dalších úprav…
Příklad: Použitím superbuňky o 2 × 2 buňkách lze u výše uvedené tiskárny v případě frekvence rastru 106 LPI zvýšit počet šedí z 33 na 129, v případě 141 LPI z 19 na 73!
Rastry a PostScript
V PostScriptu se nejčastěji používají pravidelné rastry. Pro jednoduché rastry jsou vyhrazeny funkce setscreen (se třemi parametry: frekvence, úhel, funkce bodu) a setcolorscreen (s 4 × 3 parametry pro jednotlivé výtažky), pro složitější je k dispozici funkce sethalftone (jejímž parametrem je slovník s požadovanými hodnotami).
Některé programy umějí nastavit rastry přímo, z PPD souboru nebo vložit hlavičkový soubor s rastrem (např. dvips -h), jiným musíme pomoci ručně několika řádky PostScriptového kódu. Tento kód je nutné vřadit za inicializaci zařízení, ale před obsah první stránky. Ideální místo najdeme podle strukturovaných komentářů – vhodné je těsně před strukturovaným komentářem %%EndSetup, případně před prvním z komentářů %%Page:. V případě Ghostscriptu máme ještě možnost volby -dDITHERPPI=frekvence_v_LPI na příkazovém řádku.
Příklady
Všechny tyto příklady jsem vygeneroval pomocí jednoduchého testu (a ruční editací tohoto souboru) generujícího následující přechod. Není-li uvedeno jinak, použil jsem opravdu hrubý a dobře viditelný rastr o frekvenci 5 LPI.
Upozornění: Tyto jednoduché rastrové funkce nejsou odolné vůči chybnému nastavení – např. použití jiného typu půltónování.
Takto vypadá standardní bodový rastr Ghostscriptu používaný pro tiskárny.
Takto vypadá standardní pole prahů, které si Ghostscript sám zvolí pro náš test s malým rozlišením.
Tato jednoduchá hlavička změní úhel rastru na 15°.
%%BeginFeature: *ResScreenAngle 15 currentscreen exch pop 15 exch setscreen %%EndFeature
Funkce bodu je funkcí mezi −1 a 1. Ze dvou vstupních proměnných generuje jednu výstupní hodnotu. Nejjednodušší funkcí bodu je zřejmě funkce pro čáry – jednu proměnnou zahodí a druhou prohlásí za výstupní hodnotu.
%%BeginFeature: *ScreenProc Line currentscreen pop { pop } setscreen %%EndFeature
Jen o málo komplikovanější funkcí vygenerujeme třeba mřížku.
%%BeginFeature: *ScreenProc BlackGrid currentscreen pop { dup 3 2 roll dup 4 1 roll add abs 3 1 roll sub abs add .25 mul } setscreen %%EndFeature
Nyní se podíváme, jak jednoduchá je hlavička pro změnu frekvence rastru na 25 LPI. Náš obrázek má rozlišení 72 DPI, a tak touto změnou dostaneme přechod složený pouze z devíti odstínů.
%%BeginFeature: *ResScreenFreq 25 currentscreen 3 -1 roll pop 25 3 1 roll setscreen %%EndFeature
K nápravě tohoto stavu jsem připravil přídavnou hlavičku, kterou lze zařadit za libovolné nastavení rastru (včetně implicitního) a z obyčejného rastru vygeneruje rastr se superbuňkami o 2 × 2 buňkách. Fyzikální frekvence zůstane 25 LPI, ale počet odstínů naroste na 33. Doporučuji tuto hlavičku vyzkoušet na fotografii z laserové tiskárny.
%%BeginFeature: Supercell Creator % (c) 1999-2001 Stanislav Brabec, UTX % please note that it works % only for "good" frequencies /screendict 1 dict def currentscreen 3 2 roll 2 div 3 -2 roll screendict begin /oldspot exch def end { dup floor sub 2 mul 1 sub exch dup floor sub 2 mul 1 sub exch screendict begin oldspot end } setscreen %%EndFeature
Tato jednoduchá ukázka napodobuje pomocí (ne)vhodně volených hodnot stochastický rastr. Pro použití u tiskáren bude zřejmě nutné zvýšit frekvenci rastru (první číslo).
%%BeginFeature: pseudo-stochastic screen .5 1 { pop pop rand 2 31 exp div } setscreen %%EndFeature
Sice nepoužitelná, ale zato krátká ukázka pole prahů. Funkce je dostupná i v Level 1, je ale nutné použít jinou syntaxi. Lepší najdete v inicializačním souboru Ghostscriptu gs_init.ps.
%%BeginFeature: trivial threshold array %%LanguageLevel: 2 << /HalftoneType 3 /Width 2 /Height 2 /Thresholds (\063\146\231\314) >> sethalftone %%EndFeature