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