GDでWindows BitMapを作成する。
GDモジュールの画像オブジェクトを、24bitフルカラービットマップにするメソッドを追加する。
sub GD::Image::bmp { my $self = shift; my ( $w, $h ) = $self->getBounds(); my $linelen = $w * 3; while ( 0 < $linelen % 4 ) { ++$linelen; } my $bit = 14 + 40 + $linelen * $h; # BITMAPFILEHEADER my $res = pack("a2VvvV", "BM", $bit, 0, 0, 14 + 40); # BITMAPINFOHEADER $res .= pack("VVVvvVVVVVV", 40, $w, $h, 1, 24, 0, 0, 0, 0, 0, 0); foreach my $y ( reverse( (0..($h-1)) ) ) { my $line = ""; foreach my $x ( 0..($w-1) ) { $line .= pack( "CCC", ( reverse ( $self->rgb( $self->getPixel($x, $y) ) ) ) ); } $line .= pack("C", 0) while ( $linelen > length $line ); $res .= $line; } return $res; }
使い方はこんな感じで。
use GD; # ここに上のソースを貼る。 my $image = GD::Image->new($filename); # フルカラー画像に限る。 open ( OUT, '>image.bmp' ); binmode ( OUT ); print OUT $image->bmp(); close ( OUT );
色々制限
GD::Imageオブジェクトならたぶん動く、と思う。
出力できるのは、24bitフルカラービットマップだけ。他は面倒だしそんなに使われないだろうから、対応してない。