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% が指定される。これが望ましくない場合は、編集=>プロファイルの指定で、適切なプロファイルを指定するとよい。
WRITE_TIFF
プロシージャを用いる。チャネルあたりの階調が8-bit(256階調)を超えるデータ、1ファイルが4GBを超えるデータ、CMYKデータなどを出力する場合はTIFFしか選択肢がない。
画像の出力方向に注意。デフォルトでは、左上を原点として出力される。OTIENTATION=0
とすることで、左下が原点となるが、互換性の問題から、あらかじめREVERSE
関数でイメージを上下反転させてから、OTIENTATION=1
(デフォルト値)で出力したほうがよい。
IDLで動画を作成するにはいくつか方法がある。
IDLffVideoWrite
オブジェクトを使って動画を作成する。いくつかのフォーマットに対応している。WRITE_GIF
プロシージャでアニメーションGIFを作成する。幅広い環境で再生できることと、圧縮による画像の劣化がないのが利点。ファイルサイズが大きくなると環境によっては再生が困難になるのと、色数が制限されるのが欠点。IDLgrMPEG
オブジェクトまたは MPEG_OPEN
等の関数を使って MPEG ファイルを作成する。現在では IDLffVideoWrite
オブジェクトに取って代わられ、Obsolete。XINTERANIMATE
プロシージャまたは CW_ANIMATE
関数には MPEG ファイルの出力機能がついている。内部では IDLgrMPEG
オブジェクトが利用されている。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
の項も参照。
convert -loop 0 -delay 50 output*.png output.gif
output*.png をAVIファイルに変換する。1秒あたりのフレーム数を -fps
で、コーデックと平均ビットレート(kbps)を -lavcopts vcodec と vbitrate
で指定する。
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色に減色しておく。
; 表示を8-bit indexed color モードに変更する
DEVICE, DECOMPOSED = 0
; 適当なカラーテーブルを設定する
LOADCT, 13
; WRITE_GIF に渡すデータは0~255の範囲に収まっている必要があるので、ここではBYTSCL関数を使う
a = BYTSCL(REPLICATE(1, 256) ## INDGEN(512))
filename = 'test.gif'
; WRITE_GIFでカラーテーブルを省略した場合、直近のLOADCTで指定されたカラーテーブルが用いられる
FOR i=0,29 DO WRITE_GIF, filename, SHIFT(a, i * 512 / 30), /MULTIPLE, REPEAT_COUNT = 0, DELAY_TIME = 10
; ファイルを閉じる
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の最大値を返すので、変な結果になってしまう。
; 表示を8-bit indexed color モードに変更する
DEVICE, DECOMPOSED = 0
; 適当なカラーテーブルを用意し、配列に保存し、最後にカラーテーブル0に設定しておく
LOADCT, 39
TVLCT, /GET, R, G, B
LOADCT, 0
a = [[INDGEN(30)], [INDGEN(30)]]
filename = 'test.gif'
FOR i=0,29 DO BEGIN
CONTOUR, a, /FILL, NLEVELS = 30, C_COLORS = SHIFT(INDGEN(30) * 256 / 30, i), TITLE = i
; WRITE_GIF の引数にカラーテーブルを与える
WRITE_GIF, filename, TVRD(), R, G, B, /MULTIPLE, REPEAT_COUNT = 0, DELAY_TIME = 10
ENDFOR
; ファイルを閉じる
WRITE_GIF, filename, /CLOSE
R, G, B
がカラーテーブルで、それぞれ赤・緑・青の値が入った1次元配列となっている。WRITE_GIF
に渡すカラーテーブルはフレームごとに変えられる。
専用のソフトと比べると品質はよくないが、IDLでも COLOR_QUAN
関数で減色処理はできる。GIFファイルに出力する場合などに使う。