home / uni / ps / gs-tips Ghostscript TIPS

標準入力からスクリプトを流し込む (20 Nov 2020)
 入力ファイル名として-を渡す。 ただ、対話的にテストランしてるときにshowpageで困る。 -dTTYPAUSEを指定すればよいのだが、最近のGhostscriptのSAFERモードでは--permit-file-read=/dev/ttyが必要なことがある。
パイプラインで画像をImageMagickに渡す

 -o - -q-qを忘れるとゴミ(起動時のメッセージ)もImageMagickに流れてしまい、ImageMagickに「こんな画像知らん」と怒られる。 実は毎回悩む。 どうしても取れないゴミメッセージは -sstdout="%stderr" を使う。 Postscript中の標準出力が環境側の標準エラー出力に出力される。 -o で指定したファイル名は /OutputFile に反映され、こちらは -sstdout の影響を受けない。 もうひとつ、PostScriptソース中に showpage を入れておかないとだめかもしれない。

アンチエイリアシング

  -dTextAlphaBits=n-dGraphicsAlphaBits=n で指定できるが、あまり性能がよくない。 -r360 のように大き目の解像度を指定して、ImageMagickで縮小したほうが結果がよい。

PNG出力ドライバ (09 Mar 2019)

  Details of Ghostscript Output Devices / PNG file format に書いてあるのだがよく忘れる。 -sDEVICE=png16 が16色、 -sDEVICE=png256 が256色、 -sDEVICE=png16m が24bppカラー。 24bppカラーなのに16mなのですごく覚えづらい(ので忘れる)。

連番画像出力 (09 Mar 2019)

  -o output-%03d.png のようにするとshowpageごとに番号をインクリメントしながら画像ファイルを作ってくれる。 WindowsのDOS窓の場合、 % がメタキャラクタなので気をつける。

出力ファイル名をスクリプト内で指定 (08 Jun 2019)

 単なる連番ではない場合や、番号が1から始まらない場合は、スクリプトの中からファイル名を指定できる。 デバイス辞書の OutputFile を再設定すればよい。

<< /OutputFile (page1000.png) >> setpagedevice

 セーフモードになっていると変更できないらしいので、きちんと動かないときは -dNOSAFER を付けてみる。

半透明

 ものすごい苦手。 本来は pdfmark オペレータで半透明にすることが可能で、 pdfmark 自体はしおりとかの生成に使えるのだが、GSは半透明関連の指定をバッサリ無視する。 その代わり、 .setblendmode .setopacityalpha.setshapealpha というのが使える。 gs9.53からこのふたつのオペレータはDeprecatedになりました。 gs9.53からは .setstrokeconstantalpha.setfillconstantalpha などのオペレータを使います。 Ghostscript and the PostScript Language / Transparency を参照。 また、 ALLOWPSTRANSPARENCYtrue に設定しておかないと半透明関連のオペレータは使用できずエラーになります。 つまり、コマンドラインで -dALLOWPSTRANSPARENCY のように指定して使います。 ALLOWPSTRANSPARENCYtrue にしておけば .setopacityalpha などの古いオペレータも使えますが、-qを指定していても標準出力に警告が出ます。 標準出力にPNGやPDFを出力してパイプでつないで処理してる場合や、CGIのレスポンスにそのまま使っている場合、ゴミが入って出力が壊れます。 コマンドラインで -sstdout="%stderr" としてメッセージが標準エラー出力に出るようにするか、新しいオペレータに書き換える必要があります(結構迷惑)。 (24 Jan 2021)

 グラフィックステートの一種なので gsave の影響を受ける。 とりあえず、

/Normal .setblendmode
0.5 dup .setstrokeconstantalpha .setfillconstantalpha
とすれば、そのあとに書いた画像は半透明になる。

 ただし、XやPNG出力ドライバは対応していなくて、 -sDEVICE=pdfwrite でPDFにする必要がある。 ps2pdf では反映されない不思議。 しかも面白いことに、PDFで反映されていれば、 gs -sDEVICE=png16m -o test.png test.pdf とすると、半透明のPNGができる。 だから、

gs -sDEVICE=pdfwrite input.ps -q -o - | gs -sDEVICE=png16m -o output.png -
と、パイプでつないで2回GSを使えば半透明のPNGができる。 へんなの。
バージョン (24 Jan 2021)

 一応 revision オペレータでGhostscriptのバージョンを得ることができるが、Ghostscript 9.26は 926 を、Ghostscript 9.53.3は 9533 を返してきた(エーっ?)。 .setopacityalpha を使うべきか .setstrokeconstantalpha を使うべきか判断するようなときは revision を使うのではなく、素直にオペレータがあるかどうかで判断した方がいいようだ。

/.setstrokeconstantalpha where {
    pop
    /.setopacityalpha {
        dup .setstrokeconstantalpha .setfillconstantalpha
    } bind def
} if

Copyright (C) 2019-2021 akamoz.jp

$Id: gs-tips.htm,v 1.7 2021/01/24 09:51:49 you Exp $