Metapost -> PNG s pruhledností [HOW-TO]

Jan Houstek houstek at karlin.mff.cuni.cz
Tue Mar 5 08:04:48 CET 2002


Nedávno se zde někdo ptal, jak (neinteraktivně) převédst výstup METAPOSTU
do PNG s těmito požadavky:

- spávné fonty a vůbec výstup maker label
- antialiasing
- transparentnost

Trochu jsem prozkoumal terén a můžu vám oznámit, že to možné je, i když
zas tak jednoduché to není. Pokusím se popsat nejen CO je přeba udělat,
ale i PROČ.

Na začátek podotýkám, že současný požadavek antialiasingu a
transparentnosti si vynucuje formát PNG, GIF totiž umi jen 1-bitovou
transparentnost -- pixel buď je nebo není průhledný.

Prblém správného zobrazení fontů je řešitelný dvěma způsoby.

1) Při nastavení prologues:=1 vyrábí Metapost plnohodnotné EPS. K jeho
   správné interpretaci v ghostscriptu musíme do ghostscriptu nainstalovat
   všechny použité fonty v type1 formátu (to už se tu jistě řešilo).
   Jestli je vše v pořádku snadno poznáme tím, že vzniklý soubor otevřeme
   v ghostscriptu.

2) Při prologues:=0 (default) vyrobí Metapost soubor, kterému správně
   rozumí pouze dvips. Pokud tedy nemáme všechny potřebné fonty v type1,
   nebo prostě chceme raději použít bitmapové fonty vyrasterované
   Metafontem, zavoláme Metapost bez prologues:=1, poté pustíme např.
   na takovýto soubor TeX (v mém případě csplain). Z příkazové řádky v
   bashi to vypadá například takto:

     csplain "\relax \input epsf \nopagenumbers \epsfbox{file.eps} \bye"

   file.eps je výstup Metapostu. Pokud bude tento řádek součástí
   skriptu, můžu místo file.eps napsat třeba $1. Vzniklý soubor
   epsf.dvi poté předhodíme dvipsu s přepínačem -E (viz dokumentace)

     dvips -E epsf.dvi -o dvips.eps

   dvips.eps už je plnohodnoté eps se všemi fonty.

Nyní již máme EPS, které můžeme předloži ghostscriptu k rasterování.
Bohužel, ghostscript neumí používat transparentnost (tedy já jsem to
nenašel), takže nám nezbývá, než nahradit bílou barvu průhlednou. Tím ale
nesmíme přímo použít antialiasing, protože pokud by se obrázek objevil na
jiném než bílém pozadí, tak by měl na hranicích takovou bílou aureolu.

Na volání ghostscriptu za účelem převodu do bitmapy se mi výborně osvědčil
balík ImageMagick, jmenovitě utilitka convert. ImageMagick je součástí
všech základních Linuxových distribucí a existuje i verze pro Windows.
Bez požadavku transparentnosti by to mohlo vypadat takto.

  convert -density <dpi> vstup.eps vystup.png

Seznam ostatních parametrů je v manuálové stránce, je jich opravdu hodně.
Pokud bychom nechtěli antialiasing, použijeme

  convert +antialias -density <dpi> vstup.eps vystup.png

Převod bílé barvy na alfa-kanál (transparentnost) se zařídí takto.

  convert -fill white -draw "color 0,0 point" -draw "matte 0,0 replace" \
    +antialias -density <dpi> vstup.eps vystup.png

(Malé vysvětlení: Našel jsem jen povel "změň tento bod a všechny stejně
barevné na průhledné". Proto pro jistotu nejdřív obarvíme pixel 0,0 (vlevo
nahoře) nabílo a teprve poté voláme změnu průhlednosti.)

Pokud potřebujeme antialiasing, tak lze použít následující řešení: Volat
nejdříve convert s 2- či 3-násobným <dpi> a poté obrázek zmenšit do
požadované velikosti. Obojí lze v UNIXu spojit pomocí pipy, nedělají se
pomocné soubory:

    convert -fill white -draw "color 0,0 point" -draw "matte 0,0 replace" \
      +antialias -density <2xdpi> vstup.eps png:- | convert -geometry 50% \
      - vystup.png

To je vše, snad to se to někomu bude hodit.

-- 
Honza Houštěk







More information about the csTeX mailing list