Raspberry PI OSにはgsという名前のコマンドがあります。gsなのでガソリン価格を調べて表示してくれそうな気もしますが、あいにくそのような機能ではありません。コマンド名は2文字ですが、意外と高機能なコマンドです。gsはGhostScriptを略したものです。

gsコマンドはページ記述言語の1つであるPostScript言語を解釈して画像を生成してくれます。PostScript言語は現在多く使われているPDF/SVGなどベクトルベースの画像データ処理の元となっているものです。PostScript言語はFORTH言語と同じスタック式のプログラム言語ですが、ページ上に図形や文字を描画することを得意としています。テキストベースで様々な図形を描くことができます。

PostScript言語はプログラミングが可能なのでいろいろなことができますが、今回は単純に図形を描かせてみます。また、gsコマンドでは画像だけでなくPDFに変換することもできます。(最後に説明します)
今回はRaspberry PI OSを使いますが、他のOSでもGhostScriptをインストールすれば同様に処理されます。(フォントに関しては同じフォントが入っていないと生成される結果が異なります)

・GhostScript
https://www.ghostscript.com/

以後の実行結果はmacOSの画面になっていますが、書体の見た目を除けばUNIX(Linux/BSD)、RaspberryPI、Windowsでも同様になります。GhostScript/PostScriptは出力するデバイスに依存しない、ということになっています。これは解像度に関係なく10cmの円を描けば10cmの円が出力/印刷されるということになります。印刷関係で多く利用された理由の1つとも言えます。(印刷関係で使われているものとしてESC/P, ESC/Pageなどがあります)

サンプルファイルは、これまでの連載と同様にデスクトップのsampleディレクトリにサンプルとなるテキストファイルを入れておきます。また、カレントディレクトリはsampleディレクトリとします。コマンドならcd ~/Desktop/sampleと入力します。

GhostScriptをインストールする

 Raspberry PI OS(フルインストール版)の場合は最初からGhostScriptがインストールされているので何もする必要はありません。
 macOSの場合は最初にHomeBrewをインストールします。すでにインストールしてある場合は以下のHomeBrewのインストール作業は不要です。

・HomeBrew
https://brew.sh/ja/

 HomeBrewのサイト上にある以下のコードをコピーしたらターミナル上にペーストしてリターンキーを押します。後は自動的にインストールされます。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

 次に以下のコマンドを入力するとGhostScriptがインストールされます。

brew install ghostscript

 Ubuntuの場合は以下のようにコマンドを入力するとGhostScriptがインストールされます。

sudo apt update
sudo apt install ghostscript

 Windowsの場合は以下の公式サイトにあるWindows用(32/64bit)のインストーラーをダウンロードします。後はインストーラーを起動し手順に従ってインストールします。

https://ghostscript.com/releases/gsdnld.html

WindowsでGhostScriptを実行するにはgsコマンドではなくgswin64cになります。(環境によって若干コマンド名が異なりますが、ここでは64bit版を想定しています。また、PowerShellではなくコマンドプロンプトで入力・実行してください)

gswin64c text1.ps

上記の例ではファイルとして保存されないのでPNG形式として保存した後で確認するには以下のように入力します。

gswin64c -sDEVICE=png16m -r72 -o result.png text1.ps

文字を表示する

 まずページ上に文字を表示してみましょう。注意点としてGhostScript/PostScript言語では座標の値は数学の座標系(原点左下)となっていることです。一般的なコンピューターの座標系は原点が左上で右下に行くに従って値が増加します。この点に注意して座標値を設定する必要があります。
 ページの中央にSample Textの文字を表示するGhostScript/PostScriptのコードは以下のようになります。このプログラムをtext1.psという名前で保存します。

【text1.ps】

%!PS
/Times-Roman findfont
24 selectfont
230 400 moveto
(Sample Text) show
showpage

 ざっと説明すると以下のようになります。


%!PS
PostScriptプログラムであることを示す識別子

c/Times-Roman findfont
フォントをTimes-Romanに設定。フォントがない場合はCourierなど他のフォントで代用

24 selectfont
フォントサイズを24ポイントに設定

230 400 moveto
X座標230ポイント、Y座標400ポイントにペン(描画の基準位置)を移動。(デフォルトでは用紙幅は横612ポイント、縦792ポイント)

(Sample Text) show
()内の文字を描画

showpage
ページ印刷


 このプログラムを実行するには以下のようにコマンドを入力します。

gs -sDEVICE=png16m -r72 -o result.png text1.ps

または

gs text1.ps

 Raspberry PIの場合、自動的にウィンドウが開いて描画結果が表示されます。

macOSなどではウィンドウは開かないので一旦PNG形式などの画像ファイルとして保存してから確認します。

gs -sDEVICE=png16m -r72 -o result.png text1.ps

以後の説明ではGhostScript/PostScriptのコードのみ示すので、実際のコマンド入力は環境に応じて指定してください。

色を指定する

 次に文字の色を指定してみます。GhostScript/PostScriptではRGBカラー、CMYKカラー、グレースケールカラーを指定することができます。まず、馴染みのあるRGBカラーを設定してみましょう。RGBカラーはsetrgbcolor命令を使います。3つの値が必要で、順番に赤、緑、青の順番で指定します。値の範囲は0.0〜1.0までの小数値で指定します。
 以下のようにするとページの左下に赤い文字が表示されます。

【text2.ps】

%!PS
/Times-Roman findfont
24 selectfont
0 40 moveto
255 0 0 setrgbcolor
(Sample Text) show
showpage

CMYKの場合はsetcmykcolor命令を使います。シアン、マゼンタ、イエロー、ブラックの4つの値を順番に指定します。値の範囲は0.0〜1.0です。

【text3.ps】

%!PS
/Times-Roman findfont
24 selectfont
0 40 moveto
1 0 0.75 0 setcmykcolor
(Sample Text) show
showpage

グレースケールカラーの場合はsetgray命令を使います。0.0〜1.0までの値を指定します。値が大きくなるほど明るくなります。

【text4.ps】

%!PS
/Times-Roman findfont
24 selectfont
0 40 moveto
0.5 setgray
(Sample Text) show
showpage

ちなみに変形文字(長体・平体)も表示することができます。これはマトリクスを使った変形になります。以下のようにすると長体(細長い文字)が表示されます。

【text5.ps】

%!PS
/Times-Roman findfont
24 scalefont
[0.7 0 0 1 0 0] makefont
setfont
100 40 moveto
(Sample Text) show
showpage

線を表示する

 次に線を表示してみましょう。GhostScript/PostScript言語ではペンの位置を基準にして様々な図形を描画します。タートルグラフィックスのLOGO言語と似たような面もあります。
 まず、ペンの移動はmovetoで行います。2つの値が必要で、X座標、Y座標の順番で指定します。値の単位は常にポイント(pt)になります。以下のようにすると(100,400)-(300,500)に線が描画されます。

【line1.ps】

%!PS
100 400 moveto
300 500 lineto
stroke
showpage

連続する直線を描く場合は、lineto命令で線の座標を指定していきます。以下のようにすると直角三角形が描かれます。

【line2.ps】

%!PS
100 400 moveto
300 500 lineto
300 400 lineto
100 400 lineto
stroke
showpage

三角形の内部を塗りつぶしたい場合はパスを作成する必要があります。パスは直線や円、ベジエ曲線など複数の図形を組み合わせて作ることができます。newpathで以後に続く描画命令をパスとして登録していきます。closepathまでが1つのパスになります。 以下のようにすると塗りつぶされた三角形が描画されます。setrgbcolorなどを使って色を指定することもできます。

【line3.ps】

%!PS
newpath
100 400 moveto
300 500 lineto
300 400 lineto
100 400 lineto
closepath
fill
showpage

円/円弧を表示する

 次に円/円弧を表示してみましょう。円/円弧の場合はarc命令を使います。このarc命令は直接X,Y座標を指定できるため、movetoなどでペン座標を指定する必要はありません。arc命令は5つの値が必要です。順番に中心X座標、中心Y座標、半径、開始角度、終了角度です。角度はラジアンではなく弧度法、つまり0〜360度の値を指定します。
 以下のようにすると中心座標(300,400)で半径100の正円を描きます。

【circle1.ps】

%!PS
300 400 100 0 360 arc
stroke
showpage

角度を指定できるので円弧を描くこともできます。以下のようにすると0度から120度までの円弧が描かれます。

【circle2.ps】

%!PS
300 400 100 0 120 arc
stroke
showpage

円弧でなく食べるパイやピザのような形にすることもできます。この場合はパスを作成しlinetoと組み合わせる必要があります。

【circle3.ps】

%!PS
newpath
300 400 100 0 120 arc
300 400 lineto
closepath
stroke
showpage

塗りつぶす場合はstrokeの代わりにfillを使います。色を指定する場合はsetrgbcolorsetcmykcolor、setgrayなどを使います。以下のようにすると赤い円弧が描かれます。余談ですがAdobe Illustratorなどのベクトル作図ソフトでは円を描くと円ではなくベジエ曲線で近似した円になる場合があります。

【circle4.ps】

%!PS
newpath
300 400 100 0 120 arc
300 400 lineto
closepath
255 0 0 setrgbcolor
fill
showpage

 次回は四角形やベジエ曲線などの図形を表示してみます。