浦川昇吾...
TRANSCRIPT
画像処理浦川 昇吾
2007年4月16日
目 次1 基礎知識 2
1.1 色 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.1 RGBカラーモデル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.2 CMYKカラーモデル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.3 HSVカラーモデル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.4 インデックスカラー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.5 グレースケール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.6 モノクロ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.7 その他いろいろ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 ラスター・ベクター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2.1 ラスター形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2.2 ベクター形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 画像の表示 7
3 ImageMagick 8
3.1 コマンド概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.2 オプション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.3 加工例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.4 練習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4 PostScript入門 22
4.1 はじめの一歩 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.2 グラフィックスの初歩 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.3 テキストとその他いろいろ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.4 gnuplotの EPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.5 EPSのあれこれ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5 各種おえかきソフト 32
6 課題 33
1
1 基礎知識1.1 色
人間が識別可能な色の数は 750万色だとか言われているらしいです。色を計算機上で表現するのに便利な考え方に『カラーモデル』というものがあります。カラーモデルとは『色を規定し、表現するための方法の体系』のことです (IT用語辞典 BINARYより)。色の定義の仕方と言ってもよいでしょう。世の中には色々なカラーモデルが存在するようですが、ここでは代表的なものの紹介にとどめます。
1.1.1 RGBカラーモデル
RGBカラーモデルは赤 (Red)、緑 (Green)、青 (Blue)の3色 (いわゆる光の3原色)で色を表現するカラーモデルです。色を重ねるごとにどんどんと明るくなり、3色を同じ量で合わせると白(グレーも含む)になります。このような色の表現方法を加法混色と呼びます。計算機のディスプレイなど発光体における色の表現によく用いられるものです。RGBカラーモデルを用いて何色の色を表現できるかは、RGBそれぞれにどれだけの階調を許すかによって異なります。現在主流なのは 24ビットカラーなどで、RGBそれぞれを 8ビット (つまり 28 = 256階調)で表現したりしています。これにより 256 × 256 × 256 = 16, 777, 216(約 1677万色)もの色を表現できます。トゥルーカラーだとかフルカラーだとか呼ばれたりしているようです。他にも 32ビットカラーだの 15ビットカラーだのあるようで、この辺に興味を持ったら IT用語辞典 e-words(http://e-words.jp)などで調べてみるとよいでしょう。
1.1.2 CMYKカラーモデル
CMYKカラーモデルは青系のシアン (Cyan)、赤系のマゼンダ (Magenta)、黄色の (Yellow)、黒で色を表現する方法です。CMYは色の3原色などと呼ばれます。これらは主に印刷物など反射光を利用して色を表現するものに用いられ、色を重ねるごとに暗くなっていきます。このような方法は減法混色などと呼ばれます。インクジェットのカラープリンターなんかはインクにこの 4色が用いられていることが多いです。黒が入っているのは、CMYを均等に混ぜて純粋な黒を表現することが技術的に難しく、その難点を補うためなようです。ちなみに Kは blackの Kではなく、Keyplateの Kならしいです。詳しくはWikipediaでも読んでください。
1.1.3 HSVカラーモデル
HSVカラーモデルは色相 (Hue)、彩度 (Saturation)、明度 (Value)の3つで色を表現する方法です。色調、鮮やかさ、明るさで表現するため人間の感覚に近く、計算機上でおえかきしたりするときに便利だったりするようです。
1.1.4 インデックスカラー
インデックスカラーというのもあります。これは使用する色を定義したカラーマップ (カラーテーブル)を用意して、その色を利用するといったものです。絵の具のパレットに似ている事からパレッ
2
トカラーとも呼ばれます。用意される色の数は 256色である場合が多く、画像の容量を小さくするのに便利ならしいです。
1.1.5 グレースケール
グレースケールは白から黒までの明暗だけで色を表現する方法です。8ビットだと 256階調、16ビットだと 65536階調の白・灰色・黒で表現されます。モノクロの画像ならば RGBなど用いず、グレースケールにした方が画像の容量が小さくなり便利です。
1.1.6 モノクロ
白黒2値とも言ったりする。グレースケールとは異なり灰色がなく、完全に白と黒の2色だけで表現する方法。もはや後半3つはカラーモデルと呼んでよいのかよくわからない。
1.1.7 その他いろいろ
カラーチャンネル
例えば RGBだったら Rのチャンネル、Gのチャンネル、Bのチャンネルなどあります。それぞれのチャンネルには赤・緑・青の色の強さが保持されており、これらのチャンネルが合わさって1枚の絵となります。画像のうち、赤など特定のシグナルのみを保持した部分ってかんじでしょうか。
アルファ値
アルファ値と言ったら大抵透明度の事です。RGBに透明度を加えた RGBAカラーモデルなんていうのもあります。アルファ値を保持するチャンネルはアルファチャンネルと呼ばれます。アルファチャンネルはもともと色以外の情報を保持するデータ領域なんかを指していたようで、マスクをかけるときなんかにも使われたりするみたいですが、まぁ手のこんだ事をしないのならば『透過度』の事と覚えておけばよいでしょう。
1.2 ラスター・ベクター
画像の形式には大きくわけて2種類あります。ひとつがラスター形式、もうひとつがベクター形式と呼ばれるものです。それぞれに長所・短所が存在し、それを理解した上でうまく使いわけられるようになると良いでしょう。
3
1.2.1 ラスター形式
ラスター形式において、画像は左図のように色のついた点 (ピクセル、ドット) の集合として表現されます。画像の表現力は『解像度』や『色解像度』に大きく左右されます。単位長さ当たりにどれだけのピクセル (ドット)が存在するかが『解像度』と呼ばれるもので、1ピクセルで表現できる色の数が『色解像度』と呼ばれるものです。『解像度』の単位には一般的に dpi(ppi)というものが使われているようです。dpiは (dot per inch)の頭文字です。ちなみに1インチは 2.54cmです。一般的な家庭用のプリンターなんかだと600dpiから 2400dpi程なようです。『色解像度』には RGBカラーモデルのところで出てきた 24ビットカラーなどのことになります。ラスター形式の画像は基本的に、各ピクセルの色情報が並んだバイナリファイルとなっています。それではA4サイズ、600dpiの画像を 24ビットカラーで表現した場合にはデータ量はどれほどになるでしょうか。ちなみに A4サイズは 210mm×297mmで、8ビットが 1バイトです。計算してみて下さい。もっと簡単な例を挙げてみましょう。携帯電話のカメラやデジカメなどで『メガピクセル』という言葉になじみがあると思います。ようは総ピクセル数がメガ単位であるということなので、1ピクセルを 24ビットカラーで表現したらどうでしょうか。いずれにしても相当な量のデータになると思います。このままだと保存とかやってられないのでデータの圧縮なんかが行われたりします。実際にカメラで撮った写真なんかを見ると結構小さくなっているでしょう。ラスター形式はデータの圧縮に関して非圧縮・可逆圧縮・不可逆圧縮と大きく3つに分けられます。さらに圧縮の手法にも色々とあったりで、様々な画像形式が世の中には存在します。代表的なものを下にまとめときます。
Windows Bitmap:
可逆圧縮もできるらしいが、基本的には非圧縮。拡張子は.bmp、CMYKは使えない。
XBM, XPM:
UNIX系でよく使われるフォーマット。非圧縮。XBM形式だと2色、XPM形式だと複数色使えるらしい。CMYKは使えないもよう。拡張子は.xbm, .xpm。C言語で書かれてるらしい。
PNM(PPM, PGM, PBM):
これもUNIX系でよく使われるらしい。非圧縮。PNMが総称名で、PPMはフルカラー、PGMはグレースケール、PBMは白黒2値の画像だそうな。拡張子は.pnm, .ppm, .pgm,.pbm。
4
JPEG:
不可逆圧縮。自然画のデータに適したフォーマット。可逆圧縮モードもあるらしいが、あんま使われてないっぽい。不可逆圧縮で画像の劣化が起きるため要注意。圧縮方法は DCT+Huffman。拡張子は.jpegもしくは.jpg。
GIF:
可逆圧縮。最大 256色のインデックスカラーしか対応してないらしい。もはやあんま使えないが、アニメーション GIFとかは楽しい。圧縮方法は LZW。拡張子は.gif。
PNG:
可逆圧縮。GIFを発展させた形で作られたらしい。圧縮方法は LZ77+Huffman で圧縮効率はGIFよりも高いらしい。透明度を示すアルファチャンネルも使えたりするので、この辺を使うと良いのではないかと。拡張子は.png。
TIFF:
基本的に非圧縮。なんかたくさんオプションが用意されてるらしいが、多くのアプリケーションでそれらは利用できないらしい。拡張子は.tiffもしくは.tif。
1.2.2 ベクター形式
ベクター形式は画像を座標や数式を用いた直線・曲線などの組み合わせによって描く形式です。なので画像データの中身は例えば『(x1, y1)から (x2, y2)まで直線を引け』みたいな感じで書かれています。例えば『ほげほげ祭』というなんとも楽しそうなお祭りを企画して、そのビラを作るとしましょう。当初は A4の紙に印刷して配るだけの予定だったのですが、A0の紙に印刷してポスターを作り駅のプラットフォームに張らせてもらおうという案が出たとします。この時もしビラを A4サイズのラスター形式で作って保存していた場合、それをA0のサイズに拡大するとなると下図の上の方のように『ジャギー』と呼ばれるギザギザが目立ってしまうでしょう。しかしもしベクター形式で作っていたら、紙のサイズに合わせて数式を計算してくれたりするので、このような事は起きません。ベクター形式は設計図みたいなものであると言えるでしょう。
当然画像の劣化などもおきず、また、上の例だと『ほげほげ祭』というタイトルや『日時:…』などといった画像を構成するパーツを別々に扱えるため、編集が楽だったりするという利点があり
5
ます。こういうと何でもかんでもベクター形式にすればよいというような気もしますが、ベクター形式は輪郭がはっきりとしたイラストなどに向いている一方で、写真のように複雑な画像には向いていません。こちらの方は先に述べたようにラスター形式の得意な分野となります。下に代表的なベクター形式をまとめます。
PostScript(PS), EPS プリンターに対して描画を指示するためのプログラミング言語であるページ記述言語の一種。RGBも CMYKも使える。LATEXを使うときによくお世話になる画像形式。LATEXなど他のアプリケーションで用いる場合には Encapsulated PostScript(EPS)という形式を用いるのが普通。EPSはバウンディングボックスやプレビュー画像などなど他のアプリケーションで用いる場合に必要な情報を補ったフォーマット。PSファイルもたいてい LATEXなどで取り込めるが、ページ全体の構成に支障をきたす恐れがあるので EPS形式で保存できる場合はそちらを選んでおくのが無難。拡張子は.ps, .eps。210のプリンターも PostScriptプリンターであり、プリンター側でラスタライズして印刷しています。
Portable Document Format(PDF) 画像というのも変だし、画像単体として扱われることも稀だけれども、PostScriptを基盤に作られたフォーマットということで紹介。RGBも CMYKもおっけ。拡張子は.pdf。
6
2 画像の表示xv
JPEGやら PNGやら GIFを見ることができます。manなどで調べてみてください。
~$ man xv
~$ xv /home1/s42607/ta/image/e000.gif
~$ xv -q -root /home1/s42607/ta/image/e000.gif
とかやってみて下さい。
上記のようなコマンドをホームディレクトリの直下にある.xsessionの途中に書いておくと、ログインしたときに自動的に壁紙を設定することができます。(でも、書き間違えるとログインできなくなるかも知れないので注意)
gv
PS, EPSファイルが見れます。
~$ gv /home1/s42607/ta/image/logo_en_c.eps
~$ gv /home1/s42607/ta/image/earth.ps
などやってみて下さい。ちなみに logo en c.epsは理学系研究科・理学部の構成員なら使う事はできますが、中身の編集などは禁じられているので注意して下さい。
xpdf, acroread
PDFファイルが見れます。
~$ xpdf /home1/s42607/ta/image/etopo5.pdf
~$ acroread /home1/s42607/ta/image/etopo5.pdf
とかやってみて下さい。acroreadで読んだ方がなにかと安心なのですが、起動に少し時間がかかる気がします。xpdfだと比較的にパッと見れるので、印刷するときは acroread使って、中身確認したいときは xpdfを使うなどと使い分けてもよいでしょう。
7
3 ImageMagick
ImageMagickは多くの画像フォーマット (manすれば何に対応してるかわかります)を操作することのできる強力なツールとライブラリのコレクションです。animate, compare, composite, conjure,convert, display, identify, import, mogrify, montage といったコマンドがあります。オプションも豊富に用意されており、それらオプションを組み合わせることで複雑な加工も可能になります。
3.1 コマンド概要
display: 画像の表示・加工
animate: 複数枚の画像を連続表示
import: スクリーンショット取得
montage: 複数枚の画像を並べてひとつの画像にする
convert: 画像形式の変換や加工
mogrify: 1枚もしくは複数枚の画像の変形など。オリジナルに上書きされるので注意
identify: 画像ファイルの情報を表示
composite: 画像の合成
compare: 画像の比較
conjure: Mgick Scripting Language(MSL)がらみ。よーわからん。
まぁ主に使うのは上の5つでしょうか。mogrifyは複数のファイルを一括して変換できるので便利ですが、オリジナルの画像に上書きされてしまうので使用する際は注意してください。identifyは簡単に画像の大きさなんかを確認できるので知ってると便利かもしれません。compositeや compareはオプションを使えば convertでも同じような事ができるので、とりあえずはいいでしょう。conjureはようわかりません。
3.2 オプション
オプションは非常にたくさんあって、全て紹介するのは無理です。ここでは代表的なものだけにとどめておきます。<???>は数値だったり色だったり??? に対応するものが入るもので、特に例をあげたりしてなければ基本数値が入る。に囲まれている部分は省略可能か、もしくは複数選択肢がある場合にどちらかを選べという意味。
-adjoin
複数の画像ファイルをひとつのファイルにまとめる。+adjoinとすれば、アニメーション GIFなんかを分解することができる。
8
-annotate ¡x-rotate¿x¡y-rotate¿{±}¡x¿{±}¡y¿ text
手軽に文字が書ける。x-rotate, y-rotateで文字の傾きを指定。x, yは書く位置の指定。位置関係は-geometryを参照。textのところには文字列を書く。より細かい設定などをしたいときは-drawを使う
-antialias
アンチエイリアシング
-append
画像の連結。-appendだと上下に。+appendだと左右に連結。
-average
複数の画像に対して、その平均をとって1枚の画像にする。
-background <color>
背景色を<color>に設定。デフォルトは多分 white。<color>は redやら blue といった名前を入れることもできるし、\#000000FFなどのように 16進数で指定することも可能。
-blur <radius>{x<sigma>}
ぼかし。正規分布を使ってぼかしを入れる。
-border <width>{x<height>}
枠で囲む。width, heightは枠の厚み。
-channel <type>
チャンネルを指定。これでチャンネルを指定したら、それ以降はそのチャンネルにのみ変換が加えられる。<type>には Red, Green, Blue, Alpha, ...といったものが入る。
-charcoal <factor>
<factor>の度合いで木炭画タッチに。てか木炭画ってなに?
9
-chop <width>x<height>±<x>±<y>%
<x>の位置から<width>分の列と、<y>の位置から<height>分の行を画像から消去。%で指定も可。<x>, <y>による位置の示し方については-geometry参照。
-clone <index>
画像の複製。画像ファイルが複数枚与えられている場合は、0からの番号が振られているので、複製したい画像の番号を indexで指定する。ちなみに最後の画像は-1でも指定でき、+cloneとすれば <index>なしで最後の画像を複製できる。
-colorize <value>
%で色の強さを変更。RGBのそれぞれのチャンネルを別々に変更したい場合は、<value>に 0/0/50などのように書けばよい。
-combine
画像の合成。グレースケールの3つの画像を-combineすると、前から順に R,G,Bのチャンネルとして合成が行なわれる。
-compose <operator>
画像の合成手法の選択。<operator>には合成手法が入る。主なものとしては、
-composite
画像の合成。これを使えば compositeコマンドと同じことが convertでできる。-composeでは合成手法を指定するだけで、合成を確定するには-compositeを用いなければならないよう。しかし versionによっては-composite与えなくても合成してくれたりもするみたい。
-contrast
画像のコントラストを変更。-contrastで強化。+contrastで減衰。重ね書きによって効果を上乗せすることができる。
-crop <width>x<height>{±}<x>{±}<y>{%}
画像の一部分を切り出すことができる。場所の指定などは-chopと同じ。
-delay <ticks>
animateなどで使う。<ticks>×1/100秒後に次の画像を表示
10
-dissolve <percent>
不透明度を <percent>%として背景画像と合成。
-draw <string>
画像の上に点やら線やら円やら文字なんかを書く際に使う。<string>のところで何をどのように書くかを指定する。
-edge <radius>
エッジング加工。
-emboss <radius>
エンボス加工。
-equalize
画像の均一化
-fill <color>
-drawで文字を書くときとかに使う色の指定。指定方法は-backgroundと同じ。
-filter <type>
画像の拡大・縮小を行うときに使うフィルターを指定。<type>に指定できるものなどについてはmanを参照。指定しなければ変換に要する時間も考慮に入れて最適なものを選択してくれるので、あまり気にする必要はないかも。
-flip, -flop
鏡像。-flipが上下方向。-flopが左右方向。
-font <type>
文字を書く際に使うフォント名<type>で指定。デフォルトで何が使えるかは convertとかに-list typeってつけて実行すればわかる。
-foreground <color>
前景色指定。-backgroundと同じ。
11
-frame <width>x<height>+<outer bevel width>+<inner bevel width>
画像にフレームをつける。<width>,<height>は全体の幅、<bevel width>は額の縁の部分の幅。フレームの色は-mattecolorで指定。
-fx <expression>
数式なんかを使って値の変更などができる。<expression>にどうするかを書く。ここでは紹介しきれないので、詳しい事しりたければmanなどで。
-gamma <value>
ガンマ補正。各チャンネルごとの明るさを補正する。<value>には各チャンネルの補正値を,で区切って 1.7,2.3,1.2のように指定する。1.0より大きい値のときに明るくなる。適正値は 0.8から 2.3ならしい。
-geometry <width>x<height>{±}<x>{±}<y>{%}{@}{!}{<}{>}
場所や大きさを指定するオプション。ImageMagickのデフォルトでは左上の隅が基準地点となっていて、そこから右・下が正、左・上が負となっている (右図参照)。%で指定も可能。縦横比を無視して変形などしたければ!を最後につければよい。<,>をつけると画像のサイズが指定したものより小さかったり大きかったりした場合にのみオプションが有効となる。この際はシェルにリダイレクトと思われないようクォーテーションで囲む必要があるので注意。@はよくわからない。
-gravity <type>
-geometryで述べた基準地点を変更するオプション。<type>には NorthWest, North,NorthEast, West, Center, East, SouthWest, South, SouthEastのいずれかが入る。デフォルトは上記のように NorthWest。NorthEast, East, SouthEastを選んだ場合は x方向において左が正となり、SouthWest, South, SouthEastを選んだ場合は y方向において上が正となるので注意。
-interlace <type>
インターレース処理。<type>のデフォルトは None。
-implode <factor>
画像中央に吸い込まれるような感じに加工
12
-level <blackpoint>{%}{,<white point}{%}{,<gamma>}
ガンマ補正。-gammaと違い RGB別にやるわけではない。
-loop <iterations>
アニメーション GIFなどでの反復回数指定。0にすれば無限に反復する。
-matte
アルファチャンネルを保存。画像がアルファチャンネルを持っていなければ不透明なものを作成。アルファチャンネルを無視したければ+matteを使うとよい。
-mattecolor <color>
-frameオプションによる枠の色指定
-median <radius>
メディアンフィルタをかける。ノイズ除去手法のひとつらしい。近傍の画素をソートし、その中央値をとることによってノイズを除去する。近傍点をいくつとるかを<radius>で指定する (のだろう)。
-monochrome
白黒画像にする。グレースケールではなく、白黒2値なので注意。
-negate
全ピクセルをその補色で置換する。
-noise <radius—type>
ノイズを軽減。+noiseとすればノイズを加えることもできる。詳細はmanで。
-page<width>x<height>{±}<x>{±}<y>{%}{!}{<}{>}
イメージキャンバスのサイズ変更。PostScriptなんかで使ったり。何が指定できるかはmanで調べましょう。
-paint <radius>
油絵タッチにする。
13
-pause <seconds>
animateで使う場合は反復前に何秒停止するかを指定するオプション。importの場合はスクリーンショットを撮るまでの待ち時間を指定できる。
-pointsize <value>
フォントサイズ指定
-quality <value>
JPEG, MIFF, PNGでの圧縮レベルを指定
-raise <width>x<height>
縁に影をつけて立体的に見せる。
-resize <width>x<height>{%}{@}{!}{<}{>}
画像のサイズ変更
-roll {±}<x>{±}<y>
画像をスクロールさせる。
-rotate <degree>{<}{>}
画像の回転。>は画像の幅が高さよりも大きい場合にのみ適用することを意味し、<
は画像の幅が高さよりも小さい場合にのみ適用することを意味する。横長の画像であればそのままで、縦長の画像だけ横長にしたいってときに便利。
-shade <azimuth>x<elevation>
光源を置いて影を作る。<azimuth>変えてもあまり何もかわらない。なんなんだろう。
-shear <x degrees>x<y degrees>
画像を傾ける。x軸、y軸に沿ってスライドされる。
-size <width>x<height>{+offset}
画像のサイズ指定
14
-spread <amount>
拡散化。<amount>によって指定された数の近傍のどれかと位置を交換することで拡散されたような加工を行う。
-swirl <degrees>
中心に向かって渦状に画像を加工。
-threshold <value>{<green>,<blue>,<opacity>}{%}
<value>を閾値とし、それを超えるものは最大値に、下回るものは最小値に変更する。
-tile <geometry>
montageのときには図のレイアウトを決めるオプションとなる。
-transparent <color>
<color>で指定した色を透明とする。
-wave <amplitude>x<wavelength>
波状に変形
15
3.3 加工例
図 1: original 図 2: -border, -bordercolor
図 3: -channel, -negate 図 4: -charcoal
図 5: -chop 図 6: -blur
図 7: -colorize 図 8: -frame, -mattecolor
1. hoge.png (original)
2. ~$ convert hoge.png -bordercolor blue -border 15x5 hoge_borders.png
3. ~$ convert hoge.png -channel R -negate hoge_r_negate.png
4. ~$ convert hoge.png -charcoal 10 hoge_charcoal.png
5. ~$ convert hoge.png -chop 30x20+100+100 hoge_chop.png
6. ~$ convert hoge.png -blur 0x5 hoge_blur.png
7. ~$ convert hoge.png -colorize 0/0/50 hoge_colorize.png
8. ~$ convert hoge.png -mattecolor red -frame 20x20+5+5 hoge_frame.png
16
図 9: -crop
図 10: -edge
図 11: -emboss 図 12: -flip
図 13: -flop 図 14: -implode
図 15: -negate 図 16: -raise
図 17: -roll 図 18: -shade
9. ~$ convert hoge.png -crop 200x120+50+70 hoge_crop.png
10. ~$ convert hoge.png -edge 5 hoge_edge.png
11. ~$ convert hoge.png -emboss 5 hoge_emboss.png
12. ~$ convert hoge.png -flip hoge_flip.png
13. ~$ convert hoge.png -flop hoge_flop.png
14. ~$ convert hoge.png -implode 0.5 hoge_implode.png
15. ~$ convert hoge.png -negate hoge_negate.png
16. ~$ convert hoge.png -raise 10x10 hoge_raise.png
17. ~$ convert hoge.png -roll +50+50 hoge_roll.png
18. ~$ convert hoge.png -shade 3x15 hoge_shade.png
17
図 19: -shear, -background 図 20: -spread
図 21: -swirl 図 22: -wave
19. ~$ convert hoge.png -background black -shear 0x5 hoge_shear.png
20. ~$ convert hoge.png -spread 3 hgoe_spread.png
21. ~$ convert hoge.png -swirl 150 hoge_swirl.png
22. ~$ convert hoge.png -wave 10x30 hoge_wave.png
18
3.4 練習
display
displayは画像の表示や加工ができるコマンドです。
~$ display /home1/s42607/ta/image/logo.png
~$ display -resize 500x200! /home1/s42607/ta/image/logo.png
~$ display -negate -write ~/hoge.jpeg /home1/s42607/ta/image/logo.png
~$ display -mattecolor red -frame 20x20+5+5 /home1/s42607/ta/image/logo.png
~$ display http://www-geoph.eps.s.u-tokyo.ac.jp/~s42607/image/light3.png
~$ display ’vid:/home1/s42607/ta/image/e???.jpg’
1. ファイル名を指定すればその画像が表示されます。2. サイズを変更して表示することも可能です。!をつけないと縦横比を保存したまま指定したサイズの枠に最大内接する大きさで表示されます。
3. フレームをつけることもできます。4. 加工したものを別ファイルで保存したりもできます。5. URIがわかっていればネット上の画像も表示可能です。6. 指定したディレクトリにある画像の一覧を表示することもできます。vid:に続けてまとめてみたい画像を指定しましょう。指定は絶対パスでも相対パスでも可能です。
animate
animateは画像を連続表示することのできるコマンドです。
~$ animate -delay 50 /home1/s42607/ta/image/e???.png
~$ animate /home1/s42607/ta/image/earth_rot.gif
などとやってみてください。
import
importは画面のスクリーンショットを撮ることができるコマンドです。
~$ import window.gif
~$ import -frame window.png
~$ import -window root screenshot.jpeg
1. コマンドを入力したら、ウィンドウの指定待ちになります。撮りたいウィンドウにマウスカーソルを合わせてポチッとしてやるとカレントディレクトリにファイルが生成されます。
2. -frameオプションをつけるとウィンドウの枠も含めて撮影されます。3. -windowオプションで rootを指定すれば画面全体のスクリーンショットが撮影されます。
19
montage
montageは複数の画像を並べて一枚の画像にしたりするコマンドです。
~$ montage -tile 2x3 /home1/s42607/ta/image/e{000,010,020,030,040,050}.png e0-5.gif
などとやってみましょう。
convert
convertは画像の形式を変換したり、オプションによって画像を加工したりするコマンドです。
~$ display /home1/s42607/ta/image/earth.png
~$ convert /home1/s42607/ta/image/earth.png -crop 500x500+126+16 earth2.png
~$ convert earth2.png -resize 300x300 earth3.png
~$ convert earth3.png -negate earth4.png
~$ convert earth4.png -modulate 100,0 -threshold 0 mask.png
~$ convert mask.png -blur 0x10 mask2.png
~$ convert mask2.png -fx ’r*(1-2.2*((i/w-.5)*(i/w-.5)+(j/h-.5)*(j/h-.5)))’ mask3.png
~$ convert mask3.png -fx ’r*0.6*j/h’ mask4.png
~$ convert earth3.png mask3.png -compose CopyOpacity earth5.png
~$ convert earth3.png mask4.png -compose CopyOpacity -flip earth6.png
~$ convert -size 300x600 xc:black \
earth6.png -geometry +0+300 -compose atop earth7.png
$ convert earth7.png earth5.png -geometry +0+0 -compose atop earth8.png
~$ convert earth8.png -background black -shear 0x1 earth9.png
~$ convert -size 1024x700 xc:black \
earth9.png -gravity southeast -compose atop earth10.png
~$ convert earth10.png -pointsize 70 -font Palatino-Italic -fill white \
-fill DarkGray -annotate 0x60+40+90 ’COCO ver. 4.0’ \
-fill white -annotate 0x0+30+80 ’COCO ver. 4.0’ earth11.png
~$ convert earth11.png -pointsize 40 -font Palatino-Italic -fill LightGray \
-draw "text 130,140 ’CCSR Ocean Component Model’" earth_fin.png
1. この画像を加工していきましょう。2. -cropというオプションを使うと一部分を切り出す事ができます。-crop <width>x<height>
± <x> ± <y>ってな感じで使います。±x,±yが切り出す場所を、width,heightが切り出す領域の広さを示します。特に何も指定しなければ場所の基準は左上の隅になります。左上を基準に右・下方向が+、左・上が-となります。今回の場合だと、earth.pngの左上を基準に右に 126ピクセル・下に 16ピクセル進んだ点を切り出し後の画像の左上の隅とし、そこから右に 500ピクセル・下に 500 ピクセルの正方形領域を切り出すってことになってます。
3. -resizeというオプションを使うと画像サイズの変更ができます。ここでは先程 500×500ピクセルで切り出した画像を 300×300ピクセルの大きさに縮小しています。
4. -negateというオプションを使えば色を補色で置き換えた画像ができます。
20
5. -modulateはこのレジュメの始めの方で説明している HSVカラーモデルにのっとって色の変更を行うオプションです。-thresholdは閾値を設けてそれを超えるものは最大値に、超えないものは最小値に値を変更するオプションです。詳しくはmanなどで。
6. -blurはぼかしを入れる事ができるオプションです。詳しい使い方はman などで。7. -fxは数式などを用いて値の変更ができるオプションです。これまた詳しくはmanなど見て下さい。
8. manでわからなかったら、http://www.imagemagick.org/なんかにすごく詳しく書いてるのでそちらもどうぞ。
9. -composeは画像の合成に使ったりするオプションです。今回はCopyOpacityというモードで earth3.pngをアルファチャンネルを導入しています。詳しくはmanなどで。
10. -composeは上と一緒ですが、今回は-flipという別のオプションが付いてます。これは上下方向の鏡像を作るオプションです。ちなみに左右方向は-flopでいけます。
11. -sizeはそのまんま大きさを指定するオプションです。xc:は単純な画像を生成することができるオプションで、-fxとかと併用するとグラデーションとかできるみたいです。今回は-size300x600 xc:blackまでで 300×600ピクセルの大きさの黒い背景を生成しています。-geometryは場所指定のオプションです。内容は上の-cropのものと同じです。-composeで今回は atopというモードを用いて背景と earth6.pngを合成しています。
12. -geometryは+0+0なら省略可能です。13. -shearというオプションを使うと画像を傾ける事ができます。詳しくはmanなんかで。傾けたことによって生じる余白は、何も指定されなければ背景色で塗り潰されます。デフォルトでは背景色は白なので、今回は-backgroundオプションを用いて背景色を黒にしています。
14. 1行目のとこは3つ上と同じです。-gravityオプションは-cropのとこで出てきた場所の基準地点を変更するオプションです。southeastだと右下の隅が基準になります。この場合は基準点から左・上が+となります。ちなみに-gravityで指定できるものには centerってのもあって、これを使うと2番目の-cropのとこは-gravity center -crop 500x500でおっけーです。
15. 文字を入れることもできます。-pointsizeは文字の大きさを指定するオプションで、-fontは文字のフォントを指定するオプションです。-fill で文字の色を指定しています。-annotateを使うと簡単に文字が書けます。
16. -drawオプションを用いても文字が書けます。ここではたいした事やってないので-annotateでもよいのですが、-annotate以上に細かい設定を加える事ができます。-drawオプションのあとに textを指定して、その次に書き始めの場所の情報を与え、その後書きたい内容を渡すと普通に文字が書けます。
21
4 PostScript入門ベクター形式のとこで出てきたPostScriptはスタック指向型のプログラミング言語です。なので中身を直接いじって色々変えたりすることができます。前回学んだ gnuplotで出力した EPSファイルの中身なんかを見ると、もういじってくれと懇願しているかのような内容になっています。スクラッチから書けとはいいませんが (自分も書けないし)、ちょこちょこっとした変更ができたりすると後々助かったりするかもしれません (しないかもしれませんが)。なので書き換えを念頭において、基本的なとこだけ少し勉強してみましょう。
4.1 はじめの一歩
スタック
PostScriptはスタックと呼ばれるデータのいれものを使って演算などを行います。ファイル内に出てくる数値は全てスタック内にほうりこまれます。例えば、”3 210 35”といった数値が並んでいるとしましょう。この時これらのデータは左図のようにスタックに積まれていきます。そして最初にアクセスできるのは最後に入れた 35になります。last in, first outということで、このようなスタックを LIFOスタックと呼びます。これは本屋で平積みにされた書籍に似ています (購入する際は一番上じゃなくて3番目にしますとかは別の話として)。スタックには数値以外のものも何だってほうりこむことができます。スタックにほうりこまれる
これらのオブジェクトの区切りは基本的にスペース、タブ、改行文字になります。
オペレータ
他の言語でのコマンドや手続きに相当するのがオペレータです。四則演算のオペレータは以下のようになっています。¶ ³
add 和。スタックトップから順に2つ数値をとりだしてその和を返す。
sub 差。スタック2番目からスタックトップの数値を引く。
mul 積。スタックトップと2番目の積を返す。
div 商。スタック2番目をスタックトップで割る。
idiv divと違い、返す値が小数点以下切り捨ての整数部。
mod 余り。スタック2番目をすスタックトップで割ったときの余りを返す。
neg スタックトップの符号を反転させる。µ ´”210 35 add”と書いてあったとしましょう。210、35がスタックにほうりこまれ、35がスタックトップに 210がその下にある状態になります。addはこれら2つをスタックからとりだし、その和をスタックにいれます。ちなみにスタックトップにオブジェクトを入れることをプッシュするといい、スタックトップからオブジェクトをとりだすことをポップするといいます。
22
四則演算ではなく、スタックの中身のいれかえなどを行うオペレータもあります。¶ ³clear スタックの内容全てをとりのぞく
dup スタックトップをコピーする
exch スタックトップとその下のオブジェクトの順番を逆にする
pop スタックトップをポップしてとりのぞく
roll スタックトップの回数分、スタック2番目の数のスタック3番目以降のオブジェクトを回転させる。µ ´
rollはちょっとわかりづらいでしょう。例をあげて更に説明します。”3 210 35 3 -1 roll”の場合を考えます。スタックトップは-1で負値になっています。スタックトップは回転させる回数を示していますが、その符号は回転の向きは意味します。正の場合はオブジェクトを上に、負の場合は下に移動させる向きで回転が行われます。今回は-1なので下向きの回転です。スタック2番目は 3となっているので、3と 210と 35の3つが回転の対象となります。なので”3 210 35 3 -1 roll”が実行されたときのスタックの状態は、スタックトップが 3、2番目が 35、3番目が 210となります。
変数と手続き
PostScriptで変数を定義するには defというコマンドを用います。
/hoge 210 def
23
は hogeという変数に 210という値を入れることを意味します。これ以降は
3 hoge add
なんかがあると、hogeに 210が入り最終的に 213がスタックトップに残ることになります。PostScriptでの手続きの定義も変数と一緒です。
/inch { 72 mul } def
とある場合、これは『72を乗ずる』という意味の手続きになります。変数と違うところは、手続き全体を {}で囲まなければならないという点です。このように定義されたあとでは
5 inch
とかかれていれば、360がスタックトップにプッシュされます。ちなみに PostScriptの座標系の単位は 1/72インチで、この手続きはインチを単位とする長さを PostScriptの座標系での長さに変換してくれるので便利ならしいです。でも日本人にはインチってあんまなじみないよね。
配列
[]や {}で囲まれたものは PostScriptでの配列となります。配列とは複数の要素からなるひとつのオブジェクトです。
[ 3 210 35 ]
[ 3 210 mul 15 ]
{ 3 210 mul 15 }
1番目のは 3, 210, 35と 3つの要素からなる配列です。一方2番目の要素数は 4つではなく 2つです。[]の配列では配列の定義時にオペレータは実行されてしまい、その結果が残ります。そのためこの場合は”3 210 mul”のところが計算され、630と 15の 2つを要素にもつ配列となります。3番目は実行可能配列と呼ばれるもので、{}で囲まれた配列は中にオペレータが入っていても定義時に実行されません。上で紹介した defなんかは、スタックから変数名と実行可能配列をひとつずつとりだし、それらをリンクさせるオペレータとも言えるでしょう。
論理型オブジェクトと条件分岐
論理型のオブジェクトももちろんあります。つまり true(真)と false(偽)の 2 つです。また 2つのオブジェクトを比較して trueか falseを返すオペレータもあります。¶ ³
eq スタックトップとその下のオブジェクトが等しければ真を返し、そうでなければ偽を返す
ne スタックトップとその下のオブジェクトが異なれば真を返し、そうでなければ偽を返す
gt スタック2番目がスタックトップよりも大きければ真を返し、そうでなければ偽を返す
ge スタック2番目がスタックトップ以上であれば真を返し、そうでなければ偽を返す
lt スタック2番目がスタックトップよりも小さければ真を返し、そうでなければ偽を返す
le スタック2番目がスタックトップ以下であれば真を返し、そうでなければ偽を返すµ ´またこれらは and, not, or, xorなんかと組み合わせて利用できます。条件分岐のオペレータは ifと ifelseがあります。
24
5 5 eq { 3 2 mul } if
4 5 eq { 3 2 mul } { 3 2 add } ifelse
条件オペレータ ifは論理型のオブジェクトと実行可能配列をそれぞれ1つスタックから取り出し、論理型オブジェクトが trueであれば実行可能配列内を実行します。上の1番目の例だと、”5 5 eq”で trueがスタックにプッシュされ、その次に”{ 3 2 mul }”がスタックにプッシュされています。ifはこの2つをスタックから取得し、論理型オブジェクトが trueであるので、”3 2 mul”を実行、スタックトップに 6をプッシュします。条件オペレータ ifelseは、論理型オブジェクト 1つと実行可能配列 2つをスタックから取り出し、論理型オブジェクトが真の場合はスタック2番目の実行可能配列を、偽の場合はスタックトップの実行可能配列を実行します。上の2番目の例だと、”4 5 eq”が falseであるので、スタックトップに入っている”{ 3 2 add }”を実行し、5がプッシュされることになります。
4.2 グラフィックスの初歩
PostScriptの座標系では原点は左下隅にあり、右・上が正の向きとなります。長さの単位は上で述べたように 1/72インチです。直線を描くにしても、まずペンを描きたい位置に持っていくという作業が必要となります。まずはじめにこのペンの位置 (カレントポイント)を指定するオペレータを紹介します。¶ ³
moveto スタックから2つ数値を取り出し、(x, y)をカレントポイントとする。(xはスタック2番目、yはスタックトップの数値)
rmoveto スタックから2つ数値を取り出し、現在のカレントポイント座標値にそれらを足した位置をカレントポイントとして更新する。
currentpoint カレントポイントの座標値を返し、スタックにプッシュする。µ ´また、PostScriptのグラフィックスを勉強する時にはパスという考え方が重要となります。パスとは例えば塗り潰す領域や線を描くときの軌跡なんかを定義するものです。直線を描く際でも『直線の軌跡をパスによって定義する』→『パスに沿って線を描く』といった手続きを踏むことになります。現在手元にあるパスをカレントパスと呼びます。カレントパスに関連するオペレータには以下のようなものがあります。¶ ³
lineto スタックから2つ数値を取り出し、カレントポイントとその点を結ぶ直線をカレントパスに加える。
rlineto rmovetoと同じように相対的な linetoを行う。
newpath カレントパスを消去する。
closepath カレントパスの作成を開始した時のポイントとカレントポイントを結ぶ直線をパスに加えてカレントパスを閉じる。µ ´
この他にも円弧を描く arcやより複雑な曲線を描く curvetoなどがあります。さてパスを設定しただけでは線は描かれません。実際に描画を行うにはまた別のオペレータを呼び出す必要があります。描画に関するオペレータには次のようなものがあります。
25
¶ ³setgray スタックトップから数値を取り出し、それによってカレントカラーを設定する。数
値の範囲は 0から 1(グレースケール)
setrgb スタックから3つ数値を取り出し、RGBによってカレントカラーを設定する。これまた数値の範囲はそれぞれ 0から 1。
setlinwidth スタックから数値を取り出し、それによってカレントの線幅を設定する。
stroke カレントパスをカレントカラーとカレントの線幅で描画する。
fill カレントパスをカレントカラーで塗り潰す。µ ´更に言うなら、本当に本当の描画はこれでは行われません。これらによって指示された命令はshowpageというオペレータを呼ぶことによってようやく描画されることになります。これらを使って正方形を描いたり、正方形領域を塗り潰したりするプログラムを考えてみましょう。
newpath
100 100 moveto
100 200 lineto
100 0 rlineto
0 -100 rlineto
closepath
stroke showpage
これは (100, 100)→ (100, 200)→ (200, 200)→ (200, 100)の順番にパスを作り、closepathによってパスを閉じて、strokeによって線を引き、showpageで描画しています。この領域を塗り潰したい場合には strokeを fillに変更すればカレントカラーで塗り潰しが行われます。このような正方形の境界に線を引き、さらに中を塗り潰したいと思うこともあるでしょう。このような場合には注意が必要です。なぜなら strokeや fillは実行されるとカレントパスを消去してしまうからです。この問題点を回避するには gsaveと grestoreを用います。gsaveはカレントパスやカレントカラーなどのカレント・グラフィック状態を保存するオペレータで、grestoreは保存されたグラフィック状態を復活させるオペレータです。これらを用いればパスを再度定義するなどの面倒な作業を必要としません。
4.3 テキストとその他いろいろ
文字も書けます。文字を書く際には次のような手続きが必要になります。
1. フォントを探す。2. フォントを希望する大きさに拡大・縮小する。3. できたフォントをカレント・フォントに設定する。4. 文字列を書く。
これらを行うオペレータは次のようなものになります。
26
¶ ³findfont スタックトップで指定した名前のフォントを探し、フォント情報をスタックトップ
にプッシュする。
scalefont スタック2番目のフォント情報を、スタックトップの大きさに拡大縮小したフォント情報とし、スタックトップにプッシュする。
setfont スタックトップのフォント情報をカレント・フォントに設定する。
show スタックトップの文字列をカレントポイントに書く。
stringwidth スタックトップの文字列を書くのに必要な幅・高さを返す。µ ´findfontで取得したフォント情報は1ポイント (1/72インチ)の大きさなので、希望の大きさに変更するには scalefontを行わなければなりません。その後 setfontでカレントフォントを設定し、showで文字列をカレントポイントから書いていきます。stringwidthは文字列の幅・高さの情報を返すもので、例えば文字列をその長さに応じた枠で囲みたいときなどに役立ちそうです。以下に一例をあげます。
/Times-Roman findfont % フォントを探す12 scalefont % フォントの大きさを 12ptに設定setfont % 以上で決めたフォントをカレントフォントに設定50 100 moveto % 書き始めの位置に移動(hogehoge) show % hogehogeは文字列であることを示すために ()でくくってあるshowpage % ページにかきだし
フォント名は \を前につけても ()で囲んでもよいみたいです。少々面倒ですが、日本語を書くこともできます。日本語に対応したRyumin-LightやGothicBBB-Mediumなどのフォントを使ってやればよいです (横書きなら-H、縦書きなら-Vを上記フォント名の末尾につけたりしないといけないので注意)。ただ文字を指定する方法が厄介で、JISコード・8進数で指定する必要があります。8進数は \の後に3桁の数値で指定します。詳細は参考文献などをあたってください。
あと gnuplotで出力した EPSファイルの中をいじるのに必要な知識といえば、線種や線端の設定などでしょうか。以下のようなオペレータがあります。¶ ³
setlinecap スタックトップの数値によって線端を設定
setlinejoin スタックトップの数値によって接続法を設定
setdash スタック2番目の配列により線種を設定、スタックトップの数値によって開始位置を設定µ ´
setlinecap, setlinejoinは右図のようになります。setlinecapの白線はパスを示しています。マイター接続は角度があまりにも小さくなると尖っている部分 (スパイクという)がかなり長くなってしまうため、閾値を設けてそれを超えるとベベル接続にするようになっていたりします。この閾値はsetmiterlimit で設定します。詳しくは文献をあたってください。
27
setdashは
[ 5 2 1 2 ] 3 setdash
のように使います。配列部分の”[5 2 1 2]”は線のパターンを示していて、中の数値の単位はポイントです。順番に、線→空白→線→空白→ · · ·となっていて、数値はその長さを示しています。スタックトップの3は線の開始位置を示しており、3単位めの次から書きはじめる事になります。最初から書きたい場合は0と指定すればよいです。直線は以下のようになります。
[ ] 0 setdash
この場合、スタックトップの0は別になんでもよく、意味をもちません。
4.4 gnuplotのEPS
それでは実際に gnuplotによってはきだされた EPSファイルの中身を見てみましょう。まぁなんでもよいのですが次のようにして画像ファイルを作ってみてください。¶ ³
~$ gnuplot
> set xrange [-pi:pi]
> plot sin(x)
> replot cos(x)
> replot sin(x)+cos(x)
> set term postscript enhanced color
> set output "gnuplot.eps"
> quitµ ´できあがったファイルを emacsなどで見てみましょう。最初の方で色々と定義していることがわかります。
28
¶ ³.../Color true def
/Solid false def
/gnulinewidth 5.000 def
/userlinewidth gnulinewidth def
/vshift -46 def
/dl {10.0 mul} def.../DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
{pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def
/BL { stroke userlinewidth 2 mul setlinewidth
Rounded { 1 setlinejoin 1 setlinecap } if } def
/AL { stroke userlinewidth 2 div setlinewidth
Rounded { 1 setlinejoin 1 setlinecap } if } def
/UL { dup gnulinewidth mul /userlinewidth exch def
dup 1 lt {pop 1} if 10 mul /udl exch def } def
/PL { stroke userlinewidth setlinewidth
Rounded { 1 setlinejoin 1 setlinecap } if } def
/LTw { PL [] 1 setgray } def
/LTb { BL [] 0 0 0 DL } def
/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def
/LT0 { PL [] 1 0 0 DL } def
/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def...µ ´
今まで述べてきた事が理解できていれば、何をやっているか大体わかるはずです。bindはまぁ今回は気にしないでも大丈夫です。無視して下さい。まぁ重要なのは Color, Solid, gnulinewidth,userlinewidth, LT0から LT8あたりでしょうか。Colorは RGBカラーの使用を許可するかどうかの変数です。誤ってグレースケールで出力してしまった時でも、この部分を falseから trueに変更すれば RGBカラーの画像になります。Solidを trueにすると破線が無効になって、全て直線で描かれることになります。gnulinewidthやuserlinewidthは線幅を定義している場所で、このあたりを的確に変更すれば、線を太くしたり細くしたりできます。LT0から LT8はグラフなどを描くときに用いられる線種を定義しているところです。[]の中で破線のパターンを定義しているので、この辺をいじると色々な破線を作ることができます。ただ dlが
29
10をかけるという手続きなので、長さは× 10ptとなっていることに注意してください。配列の次に並んでいる3つの数字はそれぞれ RGBの値を示しています。上で書いたように0が最小値、1が最大値です。この割合を変更すれば線の色が変更できます。実際に色々といじってみてください。更に下の方に行くと文字を書いている場所があったりします。¶ ³...[ [(Helvetica) 140.0 0.0 true true 0 (-1.5)]
] -46.7 MRshow...µ ´
Helveticaはフォント名です。”(-1.5)”なんかを別のものに変更したりしてみましょう。ちなみに gnuplotは文字をそのまま文字として書いていますが、ものによってはフォント指定などせずに文字を直線や曲線で描いちゃうような場合もあります (DCLや GrADSなど)。そういう場合は文字の書き換えはやっかいです。なんとかしようと思えばなんとかできそうですが、作り直した方がはやいでしょう。
4.5 EPSのあれこれ
Encapsulated Postscriptは他のアプリケーションで利用する際に必要な情報を補ったフォーマットであることは最初の方で述べました。ここではそのような情報のうち、覚えておくと便利なものを紹介します。
Orientation
先程 gnuplotで作った EPSファイルの中身をもう一度見てみましょう。最初の方に¶ ³...%%Title: gnuplot.eps
%%Creator: gnuplot 4.0 patchlevel 0
%%CreationDate: Sat Apr 7 22:08:02 2007
%%DocumentFonts: (atend)
%%BoundingBox: 50 50 554 770
%%Orientation: Landscape
%%Pages: (atend)
%%EndComments...µ ´
みたいなのがあるはずです。PostScriptでは%が最初についているとその文はコメント文となります。なので描画に直接関係するものではありません。しかし他のアプリケーションでこのファイルを扱う際に使われていたりする情報だったりします。それでは gvで (ここ重要)この画像を見てみましょう。
~$ gv gnuplot.eps &
30
などとやってみて下さい。まあ普通に思った通りの表示があると思います。それでは画像の上にあるメニュー的なところを見てください。今見ているファイルの中身の%%Orientation:のところに書いてあるものと全く同じ文字があるのがわかるでしょう。ここにある”Landscape”とは『横長』のことを意味します。gvはファイルの Orientationのところに Landscapeとあるのを見て横長に画像を表示しています。Landscapeと書いてある場所をマウスで押してやるとメニューが出てきます。色々ありますが、Portraitというのを選んでみて下さい。縦長に表示されるでしょう。”Portrait”は縦長を意味します。それでは一度 gvを終了させて、ファイルを emacsなどのエディタで開いてください。開いたら、%%Orientationのところを Landscapeから Portraitに変更してみましょう。変更したらもう一度gvで開いてみて下さい。今度は縦長で表示されるはずです。
BoundingBox
Orientationの上に BoundingBoxというのがあります。BoundingBoxは『額の内側』みたいなものです。キャンバスに絵を描いたとしても、額に入れると隠れる部分が出てきます。逆に言えば、『見せたい場所だけを見せる』ことができます。%%BoundingBoxの隣りにある 4つの数字は、Portraitで見たときの左下隅と右上隅の x座標、y座標です。『Portraitで見たときの』位置関係である事に注意して下さい。それでは実際に値を変えたりしてみましょう。まず gvで開いて、Landscapeの2つ隣りが”BBox”となっているかどうか確認して下さい。なってなければ BBoxに変更しましょう。値を書きかえたら、一旦 gvを終了させて開きなおしても良いですし、それが面倒であれば、”File”のところを押して”Reload” を選択するとよいでしょう。描画される範囲が変更されるはずです。
これから EPSファイルなどを扱っていく中で、『やたら余白が大きくて困る』とか『この図のこ
31
の部分だけ』を使いたいとか思うこともあるかと思います。そんなときちょっと便利です。ちなみにこの BoudingBoxをうまく使えば LATEXに EPS以外のフォーマットの画像も貼れたりします。
5 各種おえかきソフトGIMP
GNU Image Manipulation Program。ラスター画像を扱うペイント系のソフトウェア。フリー。Windowsなんかにも移植されているので知っている人も多いのでは。この手のものだとAdobeのPhotoShopなんかが王様ですが、別名フォトショップキラーの GIMPは結構多機能なソフトウェアです。DTPなんかを本気でやる人とかでなければ、GIMPで十分ではないかと思われます。
~$ gimp &
とターミナルで打つと起動します。最初いろいろ聞かれたりすると思いますが、まぁ適当にやっちゃってください。GUIなので結構直感的に作業できますし、書籍やらネットやらで詳しく説明しているところも多いので、そちらを参照してください。なお、去年の画像処理の授業で使った練習問題が
http://www-geoph.eps.s.u-tokyo.ac.jp/~s42607/gimp.xhtml
にありますので、よろしければどうぞ。
Tgif
ベクター画像を扱えるドロー系のソフトです。
~$ tgif &
とうってみてください。保存形式は*.objで、『印刷/出力フォーマット』を『LATEX(EPS)』にして『印刷』とやれば EPSファイルが生成されます。『印刷』でファイル生成って変に思う人もいるかもしれませんが、割とよくあることなので覚えておくとよいです。ちょろちょろっとしたものを書きたいときには便利です。
その他
他にもドロー系ソフトとしてはXfigや Sketchなんかがあります。OpenOffice のDrawなんかも210で使えます。多分 210には入っていないですが、Inkscape というソフトも Adobe Illustratorライクで、結構使えるんじゃないかと思います。まぁGUIなソフトウェアは使ってりゃぁ慣れるので、色々とおえかきしてみて下さい。
32
6 課題課題1
ImageMagickを使って、なんか作ってみて下さい。『何作ればいいかわからん』という人は、自分の名前でもなんでも良いので、ロゴのようなものでも作って下さい (例:̃ s42607/ta/image/example.png)。例のように影つけてみるなり、まわりに枠つけてみるなり何かしら工夫して下さい。この例程度であれば1行でサクッとつくれます。ちなみに ImageMagickはTrue Type Fontなんかを扱えるので、おもしろげなフォントをダウンロードしてきて使うのもよいでしょう (http://www.dafont.com/など)。
例¶ ³~$ convert -size 300x100 xc:white \
-font ~s42607/ta/font/LOKICOLA.TTF \
-pointsize 80 -annotate 0x0+20+75 ’Loki Cola’ lokicola.pngµ ´課題2
gnuplotの EPSファイルにおいて、LT0~LT8のところを参考に DLを説明して下さい。
提出先など
課題1はできた画像とその作り方を、課題2は説明文をメールで提出してください。提出先は
です。〆切は4月末とします。わからない事あったらメールなどで聞いて下さい。
33