2008年7月22日火曜日

GIMPをscript-fuで自動化

GIMPの動作中の画像です。




Schemeというプログラム言語"LISP"の一種があるんですが、
GIMPではこれで自動化スクリプトをコーディングします。
GIMP内では"script-fu"と呼ばれてます。スクリプト・フー。
以下はその例です。

(
(define (my-test-seq-filename-jpg i N)
(let*
(
(str_i (number->string i))
(LEN_i (string-length str_i))
(LEN_N (string-length (number->string N)))
(N_zero (- LEN_N LEN_i))
(Zeros)
(i)
)

(set! Zeros "")
(set! i 0)
(while (< i N_zero)
(set! Zeros (string-append Zeros "0"))
(set! i (+ i 1))
)
(string-append "src/" Zeros str_i ".jpg")
))

(define (my-test-func theLayer i TIME_CYCLE FPS)
(let* (
(Color)
(color)
(PI (acos -1))
)

(set! color
(* 255
(/ (+ (cos (+ PI (/ (* 2 (* PI i)) (* TIME_CYCLE FPS)))) 1) 2)))
(set! Color (list 255 color color))
(gimp-context-set-background Color)
(gimp-drawable-fill theLayer BACKGROUND-FILL)
theLayer
))

(define (my-test)
(let*
(
(W 704)
(H 396)
(TIME 20)
(TIME_CYCLE 2)
(FPS 25)
(N (* TIME FPS))

(theImage
(car
(gimp-image-new W H RGB)
))
(theLayer
(car
(gimp-layer-new
theImage
W
H
RGB-IMAGE
"layer 1"
100
NORMAL
)))

(i)
(filename)
)

(gimp-image-add-layer theImage theLayer 0)

(set! i 0)
(while (< i N)
(set! theLayer (my-test-func theLayer i TIME_CYCLE FPS))

(set! filename (my-test-seq-filename-jpg i N))
(file-jpeg-save
1 theImage theLayer filename filename 1 0 0 0 "" 0 0 0 0
)

(set! i (+ i 1))
)
))

(my-test)
(gimp-quit 0)
)


このようなスクリプト(script.scm)を用意して

$ cat script.scm | gimp -i -b -


とgimpに渡してやると、連番画像ファイルが作成されます。上の例では500枚。
この連番画像ファイルをFFmpegで動画化できます。


GIMP+FFmepgで製作した動画


紅白サイクル


紅白点滅 ※危険※ 光過敏性発作の危険がありますので再生には注意ください



他の動画作成ソフトを使えばall-in-oneですべて済みそうなものですが、
原理的に1frameづつGIMPで可能なあらゆる処理を適用できる点、楽しい動画作成方法です。
コマンドベースですのでシェルスクリプトで連番画像作成や動画化をバッチ処理できます。
ガツガツ製作できそうです。