Hlavní navigace

Grafika v UNIXu - tiskové rastry

3. 12. 2001
Doba čtení: 7 minut

Sdílet

V minulém dílu jsme si vysvětlili možné způsoby polotónování. Dnes se budeme zabývat pouze pravidelnými rozklady – rastry a nastavením jejich frekvence. Volba rastru je dalším důležitým parametrem, který je s rozlišením těsně svázán.

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 neodstranitel­né 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=frek­vence_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í.

test v šedích

 

Takto vypadá standardní bodový rastr Ghostscriptu používaný pro tiskárny.

tiskový rastr Ghostscriptu

 

Takto vypadá standardní pole prahů, které si Ghostscript sám zvolí pro náš test s malým rozlišením.

rastr Ghostscriptu pro malá rozlišení

 

Tato jednoduchá hlavička změní úhel rastru na 15°.

%%BeginFeature: *ResScreenAngle 15
currentscreen exch pop 15 exch setscreen
%%EndFeature

rastr 15°

 

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

čárový rastr

 

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

mřížový rastr

 

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

změna frekvence rastru na 25 LPI

 

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

rastr o frekvenci 25 LPI se superbuňkami

 

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

náhodný rastr

 

root_podpora

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

pole prahů

Byl pro vás článek přínosný?