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なのが納得できた。