このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
今日は BMP を作ってみよう。
といっても、画像系ソフトを使わずに、
プログラム的に生成する。
個人的な趣味もあるので、あえて Perl を使ってみよう。
# bmpgen.pl
binmode(select); # Windows
my $width = 100; # 今は 4 の倍数のみ。理由はまた今度。
my $height = 75;
# BITMAPFILEHEADER
print pack("a2VvvV", "BM", 14 + 40 + $width * $height * 3, 0, 0, 14 + 40);
# BITMAPINFOHEADER
print pack("VVVvvVVVVVV", 40, $width, $height, 1, 24, 0, 0, 0, 0, 0, 0);
print pack("CCC", 255, 0, 0) x $width x 25; # 青 25 行
print pack("CCC", 0, 0, 255) x $width x 25; # 赤 25 行
print pack("CCC", 0, 255, 0) x $width x 25; # 緑 25 行
実行すると標準出力に画像を生成する。
$ perl ./bmpgen.pl > 国旗みたい.bmp
100 x 75 で、上から緑、赤、青の帯状の画像だ。
どうも Perl らしからぬコードになったが、
BMP は、たったこれだけで作ることができる。
Perl でバイナリを扱う為には pack/unpack 関数を利用する。
BMP はリトルエンディアンで数値を格納する。
そのため、pack では、v と V を利用する。
V は 4 バイト、v は 2 バイトのリトルエンディアン数値。
Perl CGI が使える環境なら、
先頭に shebang を追加し、
binmode の後にメディアタイプ出力行を追加すれば、
bmpgen.cgi とかで Web サーバ上で実行することもできる。
#!/usr/local/bin/perl
binmode(select); # Windows
print "Content-Type: image/bmp\x0d\x0a\x0d\x0a";
my $width = 100; # 今は 4 の倍数のみ。理由はまた今度。
# 以下同じ
次回以降、少しずつ解説していこうかな。