画像・動画

IDLで静止画を出力する

IDLで静止画を出力する昔ながらの方法としては、WRITE_BMP, WRITE_GIF, WRITE_IMAGE, WRITE_JPEG, WRITE_JPEG2000, WRITE_NRIF, WRITE_PICT, WRITE_PNG, WRITE_PPM, WRITE_SRF, WRITE_TIFFプロシージャがある。いくつかのプロシージャではOTIENTATIONまたはORDERキーワードを適切に設定しないと、画像の上下が反転してしまうことがある。

IDLが出力する画像ファイルには、カラープロファイル情報は含まれない。このため、IDLで出力した画像ファイルを他のソフトウェアで開くと、色や明るさが想定していたものから変わってしまうことがある。多くのソフトウェアではカラープロファイル情報が含まれない画像ファイルのカラープロファイルを sRGB または sGray だとみなして処理するが、そうでないものもある。例えば、カラープロファイル情報が含まれないグレースケール画像を Adobe Photoshop で開くと、標準でプロファイルは Dot Gain 15% が指定される。これが望ましくない場合は、編集=>プロファイルの指定で、適切なプロファイルを指定するとよい。

TIFF画像を出力する

WRITE_TIFFプロシージャを用いる。チャネルあたりの階調が8-bit(256階調)を超えるデータ、1ファイルが4GBを超えるデータ、CMYKデータなどを出力する場合はTIFFしか選択肢がない。

画像の出力方向に注意。デフォルトでは、左上を原点として出力される。OTIENTATION=0とすることで、左下が原点となるが、互換性の問題から、あらかじめREVERSE関数でイメージを上下反転させてから、OTIENTATION=1(デフォルト値)で出力したほうがよい。

IDLで動画を出力する

IDLで動画を作成するにはいくつか方法がある。

  1. 1フレームごとに静止画像として保存し、別の適当なソフト(たとえばmencoder)でくっつけて動画にする。確実。並列化可能。
  2. IDL 8.1 で追加された IDLffVideoWrite オブジェクトを使って動画を作成する。いくつかのフォーマットに対応している。
  3. WRITE_GIF プロシージャでアニメーションGIFを作成する。幅広い環境で再生できることと、圧縮による画像の劣化がないのが利点。ファイルサイズが大きくなると環境によっては再生が困難になるのと、色数が制限されるのが欠点。
  4. IDL 5.1 で追加された IDLgrMPEG オブジェクトまたは MPEG_OPEN 等の関数を使って MPEG ファイルを作成する。現在では IDLffVideoWrite オブジェクトに取って代わられ、Obsolete。
  5. 動画再生ウィジェットを提供する XINTERANIMATE プロシージャまたは CW_ANIMATE 関数には MPEG ファイルの出力機能がついている。内部では IDLgrMPEG オブジェクトが利用されている。
  6. IDL 6.3 で追加された IDLffMJPEG2000 オブジェクトを使ってMotion JPEG2000 (MJ2) を作成する。再生できる環境が少ない。

連番の静止画像として出力しあとで連結する

最初に、動画を構成する各フレームを、個々の画像として保存する。24-bit color ならPNG、8-bit color なら GIFがサイズが小さくてよい。

output*.png をアニメーションGIF (output.gif) に変換する。-loop は繰り返し回数を指定し、0の場合は無限に繰り返す。フレーム間の時間間隔 (delay time) は -delay オプションで 1/100秒(10ミリ秒) 単位で指定する。Delay timeについては WRITE_GIF の項も参照。

  1. convert -loop 0 -delay 50 output*.png output.gif

output*.png をAVIファイルに変換する。1秒あたりのフレーム数を -fps で、コーデックと平均ビットレート(kbps)を -lavcopts vcodec と vbitrate で指定する。

  1. mencoder 'mf://output*.png' -mf fps=10 -ovc lavc -lavcopts vcodec=wmv2:vbitrate=10000 -o output.avi

IDLffVideoWrite で動画を作成する

IDL 8.1 で動画を作成する IDLffVideoWrite オブジェクトが追加された。 いくつかの動画形式・コーデックに対応している。FFmpeg が利用されている。IDL 8.4ではffmpegライブラリの問題によりIDLffVideoWriteでアニメーションGIFファイルを作成できない。

WRITE_GIF でGIFアニメーションを作成する

IDLで昔ながらの方法でGIFファイルを作成するには WRITE_GIF プロシージャを使う。GIFでは通常は256色までしか使えないので、カラーのGIFファイルを出力する際は、8-bit indexed color のイメージを渡す必要がある。値の範囲は0~255の範囲に収まっている必要があるので、そうでないデータはBYTSCL関数などを使って処理しておく。Full colorのイメージの場合はあらかじめ256色に減色しておく

  1. ; 表示を8-bit indexed color モードに変更する
  2. DEVICE, DECOMPOSED = 0
  3. ; 適当なカラーテーブルを設定する
  4. LOADCT, 13
  5. ; WRITE_GIF に渡すデータは0~255の範囲に収まっている必要があるので、ここではBYTSCL関数を使う
  6. a = BYTSCL(REPLICATE(1, 256) ## INDGEN(512))
  7. filename = 'test.gif'
  8. ; WRITE_GIFでカラーテーブルを省略した場合、直近のLOADCTで指定されたカラーテーブルが用いられる
  9. FOR i=0,29 DO WRITE_GIF, filename, SHIFT(a, i * 512 / 30), /MULTIPLE, REPEAT_COUNT = 0, DELAY_TIME = 10
  10. ; ファイルを閉じる
  11. WRITE_GIF, filename, /CLOSE

この例のように WRITE_GIF の引数でカラーテーブルを省略した場合には、直近の LOADCT 等で指定されたカラーテーブルが使われる。もし、IDL起動後一度も LOADCT 等を実行していなかった場合は、WRITE_GIF 内部で LOADCT, 0 が実行される。WRITE_GIFの引数で明示的にカラーテーブルを指定しない限り、WRITE_GIF でファイルを開いてフレームを出力し始めた後に LOADCT 等でカラーテーブルを変更したとしても、その変更は後に出力されるフレームには反映されない。

DELAY_TIME キーワードでフレーム間の時間間隔(delay time)を整数で設定する。単位は1/100秒(10ミリ秒)。DELAY_TIME を設定しない場合、PowerPoint などで再生できないことがある。また、DELAY_TIME を5 (50ミリ秒) 以下にすると、多くの環境では指定された速度よりも遅く再生される。DELAY_TIME は6 (60ミリ秒) 以上を指定した方がよい(詳細はFrame Delay Times for Animated GIFsを参照)。

REPEAT_COUNT キーワードで繰り返し回数を指定できる。最初のフレーム出力時のみ有効。0を指定した場合は無限に繰り返す。省略時は、1回再生されると停止する。

TRANSPARENT キーワードで、透過色を0~255の範囲で指定できる。デフォルトでは透過しない。透過する領域がフレームごとに変化する場合は、DISPOSAL_METHOD キーワードを適切に設定する必要がある(通常は2を指定し、毎回背景色で上書きさせる)。背景色は BACKGROUND_COLOR キーワードで指定でき、デフォルト値は0 (BACKGROUND_COLOR は最初のフレーム出力時のみ指定が有効)。

DISPOSAL_METHOD キーワードでフレーム表示後の取扱い方法(disposal method)を指定できる。0を指定すると何もしない。1を指定するとフレームはそのまま残される。2を指定すると毎回背景色で上書きする。3を指定すると前のフレームを復元する。Disposal methodをきちんと解釈しない表示ソフトもある。

Windowに出力した絵を TVRD 関数を用いて取得し、GIFファイルに保存する場合は、カラーテーブルをグレースケール(LOADCT, 0)にしておく必要がある。そうしないと、TVRD 関数はRGBの最大値を返すので、変な結果になってしまう。

  1. ; 表示を8-bit indexed color モードに変更する
  2. DEVICE, DECOMPOSED = 0
  3. ; 適当なカラーテーブルを用意し、配列に保存し、最後にカラーテーブル0に設定しておく
  4. LOADCT, 39
  5. TVLCT, /GET, R, G, B
  6. LOADCT, 0
  7. a = [[INDGEN(30)], [INDGEN(30)]]
  8. filename = 'test.gif'
  9. FOR i=0,29 DO BEGIN
  10. CONTOUR, a, /FILL, NLEVELS = 30, C_COLORS = SHIFT(INDGEN(30) * 256 / 30, i), TITLE = i
  11. ; WRITE_GIF の引数にカラーテーブルを与える
  12. WRITE_GIF, filename, TVRD(), R, G, B, /MULTIPLE, REPEAT_COUNT = 0, DELAY_TIME = 10
  13. ENDFOR
  14. ; ファイルを閉じる
  15. WRITE_GIF, filename, /CLOSE

R, G, B がカラーテーブルで、それぞれ赤・緑・青の値が入った1次元配列となっている。WRITE_GIF に渡すカラーテーブルはフレームごとに変えられる。

減色する

専用のソフトと比べると品質はよくないが、IDLでも COLOR_QUAN 関数で減色処理はできる。GIFファイルに出力する場合などに使う。

西田圭佑 (NISHIDA Keisuke)
nishida at kwasan.kyoto-u.ac.jp