Hlavní navigace

Grafika v UNIXu - přenosové funkce, výroba PDF a postscriptové triky

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

Sdílet

V dnešním dílu dokončíme sérii článků o PostScriptu a tisku a ukážeme si způsob, jak doladit tisk na černobílých tiskárnách. Dále si popíšeme, jak se „destiluje“ PostScript pomocí ps2pdf z Ghostscriptu. Nakonec splním svůj slib a předvedu pár několikařádkových postscriptových triků, které potvrzují, že znalost PostScriptu není ani ve světě komerčních aplikací k zahození.

V minulých dílech jsme si vysvětlili význam rozlišení a rastrů a naznačili si jejich použití v PostScriptu. Umíme již nastavit správný rastr a frekvenci do PostScriptového souboru, i když to aplikace nepodporuje.

Rastry by nám však nebyly nic platné, kdybychom posílali do tiskárny data lineárně úměrná stupni šedosti (o nelinearitě tiskového procesu jsme se zmínili ve třetím dílu). A tak je ke kvalitnímu nastavení tiskárny potřebné přidat další veličinu – přenosovou funkci. Přenosová funkce závisí nejenom na konkrétní tiskárně, ale také na zvoleném rastru a jeho frekvenci. Vyšší frekvence rastrů bývají náchylnější k nežádoucím jevům, které většinou působí změnu kontrastu a ztmavnutí. Přenosová funkce pak tento jev koriguje.

Pro černobílý tisk však k jejímu základnímu nastavení nepotřebujeme měřící aparatury, ale vystačíme s vlastním zrakem. Vytiskneme si „referenční tabulku“ (což je obyčejná tabulka s různě tmavými čtverečky, vytištěná s žádanou hodnotou přenosové funkce a s velmi nízkou frekvencí rastru – vzniklé barvy jsou při pohledu z velké dálky poměrně přesné). Druhou tabulku vytiskneme s rastrem, který budeme chtít v praxi používat, a tabulky poté porovnáme. Pomocí některé z níže uvedených přenosových funkcí si vytvoříme korekci a upravujeme, dokud nejsme spokojeni. Podobně můžeme za referenci považovat obrazovku svého monitoru a přenosovou funkci upravit tak, aby výtisk odpovídal monitoru.

K nastavení přenosové funkce v PostScriptu slouží operátory settransfer, setcolortransfer a též jeden z parametrů v minulém dílu zmíněného sethalftone. Přenosová funkce je též součástí barevných profilů barevných tiskáren.

Nejjednodušší přenosovou funkcí je – jak to bývá obvyklé – žádná přenosová funkce (přesněji řečeno identická funkce). Tato myšlenka vznikla v době prvních DTP pracovišť na počítačích Apple Macintosh. Obraz byl před zobrazením na monitor upraven tak, aby se po vytištění na tiskárně LaserWriter jevil stejně tmavý jako na obrazovce. Na počítačích PC se sice tato korekce nepoužívá, ale na druhou stranu dnešní tiskárny tisknou často jemnějším rastrem, a proto i o trochu tmavěji. A tak pro nenáročný černobílý tisk tato praxe stále ještě přetrvává. Ztmavnutí odstínů způsobené elektronovým dělem obrazovky (a korigované gama křivkou) je podobné ztmavnutí způsobenému nárůstem tiskového bodu při tiskovém procesu.

%%BeginFeature *DefaultTransfer Null
{} settransfer
%%EndFeature

Chceme-li posílat do tiskárny data bez gama korekce, může nám posloužit přenosová funkce, provádějící gama korekci (za hodnotu číslo je třeba si doplnit hodnotu 1/gama). Stejná funkce, ovšem s jinou hodnotou, nám poslouží k jednoduchému ztmavení (hodnoty větší než 1) nebo zesvětlení (hodnoty menší než 1) tisku.

%%BeginFeature *Transfer gamma číslo
{číslo exp} settransfer
%%EndFeature

Nakonec uvádím jednoduchou interpolovanou přenosovou funkci. Zadáme hodnotu přenosové funkce v některých bodech (každé dvě číslice ve špičatých závorkách dávají jedno hexadecimální číslo určující hodnotu, přičemž řada čísel může být libovolně dlouhá). V uvedeném příkladě dává řada lineární přenosovou funkci, ale úpravou čísel, případně předřazením gama funkce lze docílit libovolné přenosové funkce.

%%BeginFeature *Transfer Interpolated
{
    >00112233445566778899aabbccddeeff<
dup length 1 sub 3 -1 roll mul dup floor cvi
    2 index exch get exch dup ceiling cvi dup
    5 -1 roll exch get 3 1 roll exch sub exch
    2 index sub mul add 255 div
} settransfer
%%EndFeature

Hlubší zájemce o rastry odkazuji na PostScript Language Reference Manual, kde se mohou dozvědět např. o přesných rastrech (AccurateScreens), fázi rastru na obrazovkách (sethalftonephase), nastavení rastrů pro barevná zařízení a o dalších možnostech postscriptového rastrování.

Převod PostScriptu na PDF

Geniální aplikací pro vytváření PDF souborů je PDFTEX z distribuce TEXu.

Mnohé aplikace však nemají možnost přímého výstupu do PDF souboru. Protože PDF při práci často potřebujeme (nejen proto, že uživatelé jiných platforem většinou nejsou schopni zobrazit ani vytisknout postscriptový soubor, byť mají postscriptovou tiskárnu – viz osmý díl), je třeba jej vyrobit z PostScriptu. Tento proces se často nazývá „destilace“, podle nejznámější aplikace, která tuto funkci nabízí. V oblasti otevřeného kódu slouží k této činnosti Ghostscript.

Jeden z nástrojů, které získáme při instalaci Ghostscriptu, se jmenuje ps2pdf. V posledních dvou letech jeho vývoj nabral obrátky, a tak dnes je ps2pdf schopný ostrého nasazení (posledními přetrvávajícími chybami jsme se zabývali v jedenáctém dílu).

K tomu, aby nám dobře sloužil, je třeba určité vyladění. Předně několika standardům formátu PDF (potažmo i verzí programu Acrobat Reader) odpovídají programy ps2pdf12 a ps2pdf13 (nebo přepínač -dCompatibility=1­.x). Program má navíc několik předvolených nastavení. Momentálně jde o 4 možnosti – implicitní nastavení (vhodné pro většinu výstupních zařízení za cenu většího souboru – bez volby na příkazové řádce nebo pomocí -dPDFSETTINGS=/de­fault), pro obrazovku (nejmenší soubor a nejmenší kvalita – nastavení -dPDFSETTINGS=/scre­en), pro tiskárnu (vhodné pro tisk – nastavení -dPDFSETTINGS=/prin­ter) a pro předtiskovou přípravu (vyšší kvalita, ale i delší soubor – nastavení -dPDFSETTINGS=/pre­press).

Navíc, podobně jako u rastrů, můžeme jemně ovlivňovat jednotlivá nastavení pomocí hlavičkového souboru. Ukázkový soubor obsahuje jedno z takových nastevení, které je určeno pro posílání souborů na digitální tiskový stroj s rozlišením 600 DPI (s rezervou nastavení v kvalitě fotografií). Chcete-li si připravit takový soubor s parametry sami, stačí se podívat do dokumentace ke Ghostscriptu, na jeho knihovní soubor gs_pdfwr.ps (kde najdete kompletní definici přednastavených hodnot) nebo přímo do specifikace těchto parametrů v dokumentu Acrobat Distiller Parameters.

Za zmínku též stojí další programy z balíku Ghostscript – např. pdf2ps, ps2ps či ps2epsi. Vytvoření dalších je otázkou několika minut, o čemž svědčí např. pdf2eps, vyrobený z pdf2ps.

PostScriptové triky

Před nějakou dobou jsem vám slíbil několik postscriptových triků. Jedná se o několikařádkové programy, řešící problém, na kterém v mnoha případech neuspělo studio vybavené drahým softwarem.

Vyrastrování do souboru

Tento příkazový řádek používám vždy, když chci pomocí Ghostscriptu vyrastrovat nějaký postscriptový soubor:

Tento příkaz rastruje tiskové strany pro tiskárnu PCL s rozlišením 600 DPI (poslední soubor o délce 2 byty je potřeba smazat).

gs -r600 -sDEVICE=ljet4 -dQUIET \
   -sOutputFile=jméno_%03d.pcl \
   -dNOPAUSE -dBATCH jméno -c quit

A tento příkaz rastruje postscriptový soubor do obrázků ve formátu TIFF s rozlišením 300 DPI.

gs -r300 -sDEVICE=tiff24nc -dQUIET \
   -sOutputFile=jméno_%03d.tif \
   -dNOPAUSE -dBATCH jméno -c quit

Word2eps (aneb z MS-Wordu do QuarkXPressu přes GNU-Linux)

Zákazník si pracně vytvořil svůj inzerát ve Wordu. Protože hrozilo, že jej budu muset přesadit v TEXu, připravil jsem následující postup zpracování (neručím za to, že bude fungovat také u vás):

  • Požádáme majitele MS-Wordu (nejlépe toho, kdo tiskovinu připravil), aby si nainstaloval některý z postscriptových ovladačů a dokument vytiskl po jednotlivých stránkách do souboru. (Jde o nejriskantnější část operace – dokument se při tisku na jiné tiskárně může zcela rozpadnout nebo být netisknutelný.)
  • Odstraníme případné zbytečné zapouzdření v jazyce PJL (několik znaků na začátku a konci souboru).
  • Spočteme skutečnou hodnotu ohraničujícího rámu příkazem gs -sDEVICE=bbox -dQUIET -dNOPAUSE -dBATCH jméno_souboru.ps a těmito hodnotami nahradíme původní, uvedené poblíž začátku souboru.
  • Někam na začátek postscriptového souboru (nejlépe těsně za první komentář %%BeginProlog) vložíme následující řádky postscriptového kódu, které „oddefinují“ nežádoucí operátory:
    /setpagedevice {pop} def
        /setmatrix {pop} def
        /= {pop} def
  • Nyní můžeme souboru dát příponu .eps. Sice se ještě nechová jako slušný EPS, neboť maže své okolí, ale např. v TEXu stačí na jeho „umravnění“ příkaz \epsfclipon z balíku epsf anebo \psclip z pstricks.
  • Protože se ukázalo, že tento soubor použije kolega ve výše uvedeném QuarkXPressu, bylo nutné ještě vygenerovat náhled podle postupu z jedenáctého dílu.

Bitová maska v TEXu

V PostScriptu existuje zajímavá možnost obarvit černobílou bitmapovou čárovou grafiku. Některé programy, např. poslední verze tiff2ps, již umějí takový EPS vyrobit, jiným lze pomoci záměnou hodnoty 1 nebo O za údajem o velikosti obrázku v parametrech příkazu image za false nebo true a výměnou operátoru image za imagemask a odstraněním operátoru setgray i s parametrem.

V TEXu však takto vygenerovaný obrázek pokusům o obarvení nadále odolává. Je to tím, že před vložením obrázku se barva vždy nastavuje na černou. Lze si proto pomoci následujícím příkazem, který tuto vlastnost zablokuje (kód je pro plainTEX):

\def\maskedepsf#1{%
  {\special{ps: save
    /normalscale{Resolution 72 div VResolution 72 div
     neg scale magscale{DVImag dup scale}if}N
    /setgray {pop} def
    /setrgbcolor {pop pop pop} def
    /setcmykcolor {pop pop pop pop} def
  }%
  #1\special{ps: restore}\special{color pop}}}

Nyní už můžeme psát \Green{\maske­depsf{kresba.ep­s}}.

Jednoduchá separace do dvou barev

Neumí váš oblíbený program dvoubarevný tisk nebo jste nepočítali s možnosti separace? Pak vám přijde vhod jednoduchý kód, který sice nevyseparuje obrázky, ale text a čáry ano.

Následující kód předpokládá, že jste sázeli černě a modře a že váš program používá barevný prostor RGB a operátor setrgbcolor pro obě tyto barvy.

CS24_early

První hlavička způsobí zmizení modré, zatímco černou ponechá.

%!
/setrgbcolor {
  add dup 2 div 3 1 roll add 3 div
  dup 3 1 roll sub
  4 mul add
 setgray } bind def

Druhá hlavička naproti tomu vymaže černou a modrou vykreslí černě.

%!
/setcolor {
  add dup 2 div 3 1 roll add 3 div
  sub
  6.01 mul 1 exch sub
 setgray } bind def
Seriál: Grafika v UNIXu

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

Autor článku