DIBを作ってみる

32bitのDIBを出力する実験。真っ白だけど。

-module(write_test).
-export([write_list/2, create_dib32/2]).

% リストをファイルに出力
write_list(F, L)->
  {ok, IO}=file:open(F, [write]),
  io:put_chars(IO, L),
  file:close(IO).

% ビットマップイメージを作る。行ごとの4byte境界がめんどくさいので32bit
create_dib32(W, H)->
  [create_header(W, H), create_body(W*H*4, [255, 255, 255, 255], [])].

% ビットマップヘッダ
create_header(W, H)->
  [create_BITMAPFILEHEADER(W, H), create_BITMAPINFOHEADER(W, H)].

% BITMAPFILEHEADER
create_BITMAPFILEHEADER(W, H)->
  ["B", "M", toDWORD(14+40+W*H*4), [0, 0], [0, 0], toDWORD(54)].

% BITMAPINFOHEADER
create_BITMAPINFOHEADER(W, H)->
  [toDWORD(40), toDWORD(W), toDWORD(H), toWORD(1), toWORD(4), toDWORD(0), toDWORD(W*H*4),
   toDWORD(0), toDWORD(0), toDWORD(0), toDWORD(0)]. 

% DWORD
toDWORD(N)->
  toByte(4, N, []).

% WORD
toWORD(N)->
  toByte(2, N, []).

% 整数を指定バイト数にばらす
toByte(0, _, L)->
  lists:reverse(L);
toByte(N, V, L)->
  toByte(N-1, V div 256, [V rem 256|L]).

% RGBデータ
create_body(0, _, RAW)->
  RAW;
create_body(N, RGBA, RAW)->
  create_body(N-1, RGBA, [RGBA|RAW]).
63> write_test:write_list("test.bmp", write_test:create_dib32(320, 240)).
ok

とりあえず任意サイズのビットマップを作成することに成功。
出力の時にリストをネストさせてもOKなのが納得できた。