example 2

zimg

zimg は、テキストファイルやバイナリーファイルから2次元のデータを読みとって 2Dイメージマップを生成します。画像フォーマットは PNG (デフォルト) と JPEG がサポートされています。

同様の機能は汎用のデータ処理ソフトにも備えられていることが多いですが zimg は専用のプログラムのため使い勝手に優れ、かつコンパクトです。

作者: Johannes Zellner さん
ホームページ: http://zimg.sourceforge.net/
バージョン: 4.19.1 (2002/10/29)
ライセンス: BSD-like (COPYING)
README を読む
付属ドキュメント man page を読む

作者の Zellner さんの専門は X 線回折のようで、zimgESRF (The European Synchrotron Radiation Facility) Data Format を扱えるようになっています。

使い方

インストールしたら、早速使ってみましょう。 サンプルデータは用意されていないので、 次の perl スクリプトで簡単なデータを作ってみます。

for ($i = 0; $i < 20; $i++) {
  for ($j = 0; $j < 40; $j++) {
    print "$j $j $j $j\n";
  }
}

このスクリプトを例えば makedata.pl の名前で保存し、次のように実行します。

$ perl makedata.pl > ex1.dat
$ zimg --column --size=160,20 ex1.dat > ex1_c.png
$ display ex1_c.png

PNG を表示するのにここでは ImageMagick の display を使っています (LinuxMLD 7 では DVD-ROM から追加インストールしてください)。 次のような画像が表示されます。

color scale

zimg はデフォルトで 240 色のカラーマップを持っています。特に指定しなければ 読み込んだデータの最小値から最大値までがカラーマップの対象となりますが、 範囲を指定することもできます。またカラーマップを変更することも可能です。

データが ascii テキストの場合、デフォルトでは各行の最初のカラムのみ読み込まれます。 オプション --column はすべてのカラムをデータとして読み込むよう 指示します。また --column=1 --column=3 ... のようにすると、指定した位置のカラムを ピックアップすることができます。

--column の代わりに短い1文字のオプション -n が 使えます。カラム位置を指定する場合は -n1 のようにオプション文字と引数の間に空白を入れないようにします。 引数が省略できないオプションの場合 (例えば --size に対する -r) は空白を置いても構いません。

オプション --jpeg を付けると JPEG フォーマットで画像を生成します。

オプション --output で出力先を指定していなければ標準出力に画像データを出力しますが、標準出力が tty になっていると (つまり、リダイレクトやパイプしていない場合) デフォルトでは画像 viewer として xv を起動 (popen) して表示しようとします (MLD には xv は収録されていません)。 この viewer は環境変数 ZIMG_VIEWER で変更できます。 当然ながら、指定する viewer は標準入力から画像データを読み込めるものであることが必要です (こんな機能がなくても自分でパイプすれば済みます。でも tty にバイナリーデータを流さないのは利点かもしれない)。

次の例では、display を viewer に指定し、 オプション --gray を使ってグレイスケールで表示します。

$ export ZIMG_VIEWER=display
$ zimg --column --size=160,20 --gray ex1.dat

gray scale

もうすこし面白みのある例として

sin2(x) - cos2(y)

を 0 <= x, y < 2π の範囲で表示してみます。 今度は perl で生成したデータを標準入力から読むように実行してみましょう。

$ perl -e '
> for ($y=0; $y<180; $y++) {
> for ($x=0; $x<180; $x++) {
> print sin($x*3.14159/90.0)**2 - cos($y*3.14159/90.0)**2,"\n";
> }}' | zimg --size=180,180 > ex2.png

このページの冒頭に掲げている画像が得られます。

バイナリーデータを読み込むには次のようなオプションでデータの型を指定します。

  -f, --float
  -d, --double
      --char
      --short
      --int
      --long-int
  -c, --unsigned-char
  -s, --unsigned-short
  -i, --unsigned-int
      --unsigned-long-int
      --complex-float=(abs/length|phase|real|imaginary)  [abs]
      --complex-double=(abs/length|phase|real|imaginary) [abs]

バイト順を指定するオプションも用意されています。

      --swap
      --big-endian
      --little-endian

次の例は、 Gri のページ の冒頭で御紹介しているサンプルのデータを使ったものです。 オプション --cbox でカラーボックスを同時に表示しています。

$ zimg --unsigned-char --size=128,128 --cbox example6image.dat > example6.png

Gri Example6

インストール

LinuxMLD 7 では zimg-4.19.1-1_mlb2.i386.rpm (68,710 bytes) を、 MLD 5、MLD 6 では zimg-4.19.1-1_mlb1.i386.rpm (67,831 bytes) をインストールします。
rpm コマンドでインストールするにはスーパーユーザになって

# rpm -i zimg-4.19.1-1_mlb2.i386.rpm

のようにします。
MLD 5,6 では Gnome の GUI でインストールすることもできます。

zimg は gd ライブラリが必要です。 MLD 7 では DVD-ROM から、 MLD 6 では Disc4 から gd-1.8.4 を追加インストールしてください。

MLD 5 では gd ライブラリは標準でインストールされていますが、 libgd がリンクしている他のライブラリの関係で libfreetype.so.6 が無いという依存性のエラーになります。 このエラーは無視して構いません。

# rpm -i --nodeps zimg-4.19.1-1_mlb1.i386.rpm

としてインストールしてください。

その他

いつも決まったオプションを指定する (例えば自分用のカラーマップを使うなど) 場合は、~/.zimgrc に書いておくことができます。またデータが ascii テキストファイルの場合はファイル自身にオプションを書いておく modelines という機能があります。

zimg は C で書いたデータのフィルタープログラムを動的にコンパイル、 リンクすることができます。詳しくは man ページでオプション --expr--expr-source の項を参照してください。 man ページには書かれていませんが、一時的に作成されるオブジェクトファイル (.so) は、環境変数 TMPDIR が定義されていればそのディレクトリに、 そうでない場合はカレントディレクトリに作成されます。

オリジナルのままでは、オプション --dump-colormap でデフォルトのカラーマップを出力すると逆順で出力されてしまう などの不具合があるので修正 (zimg-4.19.1.patch) を加えています。 (ChangeLog によると 2002-09-27 に

    * color.c: inverted the default map, so that it has red vor high values

という修正がされていて、その副作用ではないかと思います。)

参考

Web 上の参考になるページを御紹介します。

[2003/05/17 作成] [2004/07/09 更新]


このページに関する御意見、御要望を science@mlb.co.jp までお寄せ下さい
Copyright © 2003-2005 Media Lab. All Rights Reserved.