Subscribed unsubscribe Subscribe Subscribe

GDモジュールでGIFアニメを作ってみた

テオ・ヤンセン展に行って衝撃を受け、あのビーチアニマルの足の機構の動きを自分で何とか表現できないか?と思いグラフィック系をちょっと弄ってみた。
何をどうすればいいのかサッパリ分からず、どういうライブラリを使えばいいのかも分からないまま、「GD.pm」というのがあるらしい、ということでちょっと使ってみた。
CPANからは上手くインストールできなかったので、MacPorts経由でインストール。

$ sudo port install p5-gd


で、よくわからないままとりあえず何か書いてみた。

#!/opt/local/bin/perl
use strict;
use warnings;

use GD;
use Math::Trig 'pi';

my $image = GD::Image->new(100, 100);

# 色の設定
my $white = $image->colorAllocate(0xFF, 0xFF, 0xFF);
my $red   = $image->colorAllocate(0xFF, 0x00, 0x00);
my $blue  = $image->colorAllocate(0x00, 0x00, 0xFF);

# GIFデータの作成
my $gifdata = $image->gifanimbegin(1, 0);
for (1..36) {
    my $angle = $_ * 10;
    # 各フレームの作成
    my $frame = GD::Image->new($image->getBounds);
    draw_frame($frame, $angle);
    $gifdata .= $frame->gifanimadd(0, 0, 0, 1);
}
$gifdata .= $image->gifanimend;

# データの書き出し
binmode STDOUT;
print $gifdata;


sub draw_frame {
    my $image = shift;
    my $arg   = pi() / 180 * shift;

    # (50, 50)を中心として直径50の円
    $image->arc(50, 50,
                50, 50,
                0, 360,
                $blue);
    # 中心から円周上へ、偏角$argの線分
    $image->line(50, 50,
                 50 + 25 * cos($arg),
                 50 - 25 * sin($arg),
                 $red);
}


リダイレクト出力して保存すると完成。

$ ./gd_test.pl > result.gif


で、出来上がったのがコレ。


とりあえず出来たっぽい。
ここから上手く発展させていけるかな…