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フルカラービットマップだけ。他は面倒だしそんなに使われないだろうから、対応してない。