このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1322562648/61
#  1] 授業単元:バイナリデータの扱い方 
#  [2] 問題文(含コード&リンク): 
#  白黒のbmp画像を読みとり、白なら0、黒なら1として以下の例のような画像情報を載せたtxtファイルを作成する。 
#  (txtファイルの1行目にはbmpの横と縦のピクセル数を書き込むこと) 
#  <例> 
#  元のbmp画像(direct.bmp):http://ime.nu/loda.jp/kng311tt/?id=74.bmp 
#                  ↓ 
#  /********direct.txtの中身******************** 
#  24 15 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 
#  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
#  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
#  ******************************************/ 
#  

'白黒のbmp画像を読みとり、白なら0、黒なら1として以下の例のような画像情報を載せたtxtファイルを作成する'(_画像ファイル名,_txtファイル名) :-
        get_bytes(_画像ファイル名,Chars),
        画像情報の取得(Chars,_幅サイズ,_高さサイズ,_ファイルの中でのイメージの位置),
        画素ならびの取得(Chars,_幅サイズ,_高さサイズ,_画素ならび),
        'txtファイルを作成する'(_txtファイル名,_幅サイズ,_画素ならび),!.

画素ならびの取得(Chars,_ファイルの中でのイメージの位置,_画素ならび) :-
        length(_ヘッダ,_ファイルの中でのイメージの位置),
        append(_ヘッダ,_画素ならび,Chars),!.

画像情報の取得(Chars,_幅サイズ,_高さサイズ,_ファイルの中でのイメージの位置) :-
        bmpヘッダー値(Chars,biWidth,_幅サイズ),
        bmpヘッダー値(Charr,biHeight,_高さサイズ),
        bmpヘッダー値(Charr,bfOffBits,_ファイルの中でのイメージの位置),!.

'txtファイルを作成する'(_txtファイル名,_幅サイズ,_高さサイズ,_画素ならび) :-
        open(_txtファイル名,write,Outstream),
        writef(Outstream,'%t %t\n',[_幅サイズ,_高さサイズ]),
        イメージデータの表示(Outstream,_幅サイズ,_高さサイズ,_画素ならび),
        close(Outstream),!.

イメージデータの表示(Outstream,_幅サイズ,_高さサイズ,_画素ならび) :-
        append(L0,[_画素|R],_画素ならび),
        length(L0,_ビットマップ変位),
        画素表示(Outstream,_ビットマップ変位,_幅サイズ,_画素),
        R = [].

画素表示(Outstream,_ビットマップ変位,_幅サイズ,255) :-
        (_幅サイズ - 1) =:= _ビットマップ変位 mod _幅サイズ,
        write(Outstream,'0\n'),!.
画素表示(Outstream,_ビットマップ変位,_,255) :-
        write(Outstream,'0 '),!.
画素表示(Outstream,_ビットマップ変位,_幅サイズ,0) :-
        (_幅サイズ - 1) =:= _ビットマップ変位 mod _幅サイズ,
        write(Outstream,'1\n'),!.
画素表示(Outstream,_ビットマップ変位,_,0) :-
        write(Outstream,'1 '),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'画像ファイルヘッダ'(bmp,0,2,bfType,'ASCII"BM"').
'画像ファイルヘッダ'(bmp,2,4,bfSize,'ファイルサイズ').
'画像ファイルヘッダ'(bmp,6,2,bfReserved1,'00').
'画像ファイルヘッダ'(bmp,8,2,bfReserved2,'00').
'画像ファイルヘッダ'(bmp,10,4,bfOffBits,'ファイルの中でのイメージの開始位置').
'画像ファイルヘッダ'(bmp,14,4,biSize,'ヘッダサイズ。40バイト').
'画像ファイルヘッダ'(bmp,18,4,biWidth,'イメージの幅(ピクセル単位)').
'画像ファイルヘッダ'(bmp,22,4,biHeight,'イメージの高さ(ピクセル単位)').
'画像ファイルヘッダ'(bmp,26,2,biPlanes,'イメージのプーン数。1でなければならない。').
'画像ファイルヘッダ'(bmp,28,2,biBitCount,'ピクセルあたりのビット数。1,4,8,24').
'画像ファイルヘッダ'(bmp,30,4,biCompression,'圧縮形式').
'画像ファイルヘッダ'(bmp,34,4,biSizeImage,'圧縮されたイメージのサイズ(バイト単位),または0').
'画像ファイルヘッダ'(bmp,38,4,biXPeisPerMeter,'水平解像度(1メートルあたりのピクセル数').
'画像ファイルヘッダ'(bmp,42,4,biYpeisPerMeter,'垂直解像度(1メートルあたりのピクセル数').
'画像ファイルヘッダ'(bmp,46,4,biCirUsed,'使用するカラー数。').
'画像ファイルヘッダ'(bmp,50,4,biCirimportant,'重要な色').
'画像ファイルヘッダ'(bmp,54,N,biIColors,'カラーマップ') :-
        '画像データならび'(_画像データならび),
        '画像ファイルヘッダ'(bmp,_オフセット,_サイズ,biCirused,_),
        length(L0,_オフセット),
        append(L0,[A,B,C,D|_],_画像データならび),
        'カラーマップ欄のサイズを得る'([A,B,C,D],N).

'カラーマップ欄のサイズを得る'([0,0,0,0],16) :- !.
'カラーマップ欄のサイズを得る'(L,N) :-
        'byte整数ならびを整数に変換'(L,0,M),
        N is 4 * M.

bmpヘッダー値(L,bfType,'BM') :- !.
bmpヘッダー値(L,_名前,_名前の値) :-
        画像ファイルヘッダ(bmp,_オフセット,4,_名前,_),
        lenght(L0,_オフセット),
        length(LX,4),
        append(L0,LX,_,L),
        'byte整数ならびを整数に変換'(LX,0,_名前の値),!.
bmpヘッダー値(L,_名前,_名前の値) :-
        画像ファイルヘッダ(bmp,_オフセット,2,_名前,_),
        lenght(L0,_オフセット),
        length(LX,2),
        append(L0,LX,_,L),
        'byte整数ならびを整数に変換'(LX,0,_名前の値),!.
bmpヘッダー値(L,_名前,_名前の値) :-
        画像ファイルヘッダ(bmp,_オフセット,_サイズ,_名前_1,_摘要),
        sub_atom(_摘要,_,_,_,_名前),
        bmpヘッダー値(L,_名前_1,_名前の値),!.

'byte整数ならびを整数に変換'([],X,X).
'byte整数ならびを整数に変換'([N|R],M_1,X) :-
        M_2 is M_1 * 256 + N,
        'byte整数ならびを整数に変換'(R,M_2,X).