2006 年 1 月 17 日 23 時 52 分

BMP を作ってみる


このアーカイブは同期化されません。 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 の倍数のみ。理由はまた今度。
# 以下同じ

次回以降、少しずつ解説していこうかな。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.