Python でバイナリデータを読む
2010年 05月 25日
ビットマップ画像の先頭 14 バイトには、BMPFILEHEADER 構造体が格納されているが、これを Python で取得してみる。
まず、バイナリデータを読み込むために struct モジュールを import する。
import struct次に構造体のサイズを算出する。
filename = "sample.bmp"
BMPFILEHEADERSIZE = struct.calc("<2sLHHL")"<2sLHHL" は構造体の各項目の型を表している。
BMPFILEHEADER は、C で表記すると、以下の構造体になる。
typedef struct tagBITMAPFILEHEADER {unsinged short の場合、"H"、unsinged long の場合、"L"とする。なお、文字の場合、"(バイト数)s"とする。また、"<" はバイトオーダーを示す。
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER
bfType は、unsigned short であるため、"<HLHHL"でもよいが、bfType は文字列 "BM" となるため、"<2sLHHL" としている。
構造体のサイズを取得したのち、ファイルから該当サイズのデータを取得する。
fo = o pen(filename, "rb")取出したデータは Python では処理できないため、構造体の各項目に分解する。
raw_bmpfileheader = fo.read(BMPFILEHEADERSIZE)
bmpfileheader = struct.unpack("<2sLHHL", raw_bmpfileheader)
print bmpfileheader