1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

超速習 PostScript チュートリアル

Last updated at Posted at 2024-02-06

なんでそんなことを

PostScript はなんか近寄りがたい気がしていたのだけれど、線画を描いて文字を入れた画像を作る用があったので、PostScriptがいちばん手っ取り早そうであった。

PostScript のチュートリアルをググると Paul Bourke 氏の文章がでてきて、大変便利なんだけれど、いくらか補うこともある。

言語について

PostScript は言語としてはスタック言語である。それは何かと言う人は上記チュートリアルを見てほしい。数値や文字列のような値が書いてあって、それを処理するオペレータが後に来るというのが特徴。

たとえば 2 4 mul とすれば 8 と書いたのと同じ結果を得る。まあ算術演算はやりたくなければ PostScript 作成前にやってしまえばいいけれど。

最低限処理系の使い方

ghostscript を使う。ただ $ gs foo.ps とすれば Linux デスクトップであれば X(ツイッターではない)に絵がかかれるが、欲しいのは PNG 画像である。試行錯誤したのだけれど、次のようにすると 1024x1024 の座標にプロットするPostScriptから 1024x1024 の画像を作成することができる。

$ gs -q -sDEVICE=pngalpha -r72 -g1024x1024 -dBATCH -dNOPAUSE
  -sOutputFile=output.png input.ps

最小のプログラム

最小のプログラムはただ showpage と書く。

showpage

これでプリンタであれば白紙を1ページ打ち出すし、 pngalpha であれば透明画像がでてくる。X に絵を描くときは showpage がなくても出てくるのだが、 pngalpha の場合には画像が出てこないので頭を抱えた。Paul のチュートリアルにも地の文に showpage を書けと書いてあるのだが、例に書いていないのでかなり時間を溶かした。

以下いくつかの命令の話をするが、最後に showpage を追加すると思って読んでほしい。

直線を引く

これで「>」型の折れ線が太さ 2 で緑色(127 255 127)で引かれる。座標値はここでは整数にしたが、小数表記も使える。色はモノクロであれば1引数の setgray を代わりに使える。

newpath
100 200 moveto
200 250 lineto
100 300 lineto
2 setlinewidth
0.5 1 0.5 setrgb
stroke

文字を書く

これで Courier フォント 12 ポイントで (200, 350) 点を左下にして「sample text」という文字が描かれる。文字列はカッコでくくる。カッコがネストすると内側は文字列値になるようだが、カッコ自体はバックスラッシュでエスケープするほうがプログラマ向きである。

/Courier findfont
12 scalefont
setfont

newpath
200 350 moveto
(sample text) show

ぬりつぶし

透明背景ではやりにくいという場合は白で塗りつぶしをしたいし、一度描いた図形の一部を消したいということがある。要は線を引く場合の stroke の代わりに fill とする。

newpath
0 0 moveto
0 1023 lineto
1023 1023 lineto
1023 0 lineto
closepath
1 1 1 setrgbcolor
fill
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?