ビットマップ ファイル (.bmp、Windows ファイル形式、8 ビット) からデータを読み取るプログラムを作成しようとしています。現在、画像データの前にヘッダーを読み取ることに固執しています。
ここで見つけた bmp の仕様を使用して、これらの構造体に bmp のファイル ヘッダー、情報ヘッダー、および画像データを保持させました。
typedef struct {
unsigned char fileMarker1;
unsigned char fileMarker2;
unsigned int bfSize;
uint16_t unused1;
uint16_t unused2;
unsigned int imageDataOffset;
} FILEHEADER;
typedef struct {
unsigned int biSize;
int width;
int height;
uint16_t planes;
uint16_t bitPix;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} INFOHEADER;
typedef struct {
unsigned char b;
unsigned char g;
unsigned char r;
} IMAGE;
これらに問題があることは実際にはわかりません(仕様のソースが間違っている場合を除きますが、他の場所を調べたところ、問題ないように思えます)。
次のコードを使用して、正しく解析されることをテストしています。
int main(void) {
FILEHEADER fh;
INFOHEADER ih;
FILE *img = fopen("img.bmp", "rb");
fread(&fh, sizeof(unsigned char), sizeof(FILEHEADER), img);
fread(&ih, sizeof(unsigned char), sizeof(INFOHEADER), img);
printf("fM1 = %c, fM2 = %c, bfS = %u, un1 = %hu, un2 = %hu, iDO = %u\n", fh.fileMarker1, fh.fileMarker2, fh.bfSize, fh.unused1, fh.unused2, fh.imageDataOffset);
printf("w = %d, h = %d\n", ih.width, ih.height);
return 0;
}
残念ながら、これを実行すると間違った結果が得られます。
User$ ./images
fM1 = B, fM2 = M, bfS = 0, un1 = 0, un2 = 118, iDO = 2621440
w = 3276800, h = 65536
そのリンクによると、unused1 と 2 は常に 0 である必要があります。また、幅と高さが完全に間違っています (16x16 の画像です)。
構造に何らかのアライメントの問題が発生しているようです。誰もこれについて経験がありますか?(私はイメージ/ビットマップ ライブラリを使用したくありません。これをすべて自分で行いたいです)。
ご協力いただきありがとうございます!