ビットマップのファイルを読み出してヘッダ情報を取得する関数を自作しました。
しかし取得したヘッダ情報が正しく表示されません(構造体のアライメント問題)
処理を簡単に説明すると、fReadしたビットマップデータのポインタを
ビットマップヘッダ構造体のポインタにキャストして参照しています。
メンバ変数ごとにオフセットと変数のサイズを定義して一つづつキャストしていけば、
問題ない事は確認できましたがメンバ一つ一つに対してこの処理を行うのは冗長だと思います。
少ないコードで分かりやすく綺麗に参照する方法があればぜひ教えてください。
lang
1#include <stdio.h> 2#include <stdlib.h> 3 4/* unsigned */ 5typedef unsigned long UINT32; /* 4byte */ 6typedef unsigned short UINT16; /* 2byte */ 7typedef unsigned char UINT8; /* 1byte */ 8typedef unsigned char BYTE; /* 1byte */ 9 10typedef struct __tagBITMAPFILEHEADER { 11 UINT16 bfType; /* ファイルタイプ 'BM' - OS/2, Windows Bitmap */ 12 UINT32 bfSize; /* ファイルサイズ (byte) */ 13 UINT16 bfReserved1; /* 予約領域 常に 0 */ 14 UINT16 bfReserved2; /* 予約領域 常に 0 */ 15 UINT32 bfOffBits; /* ファイル先頭から画像データまでのオフセット (byte) */ 16}BITMAPFILEHEADER; 17 18/* Windows */ 19typedef struct __tagBITMAPINFOHEADER{ 20 UINT32 biSize; /* 情報ヘッダサイズ[40byte] */ 21 UINT32 biWidth; /* 画像の幅[ピクセル] */ 22 UINT32 biHeight; /* 画像の高さ[ピクセル] */ 23 UINT16 biPlanes; /* プレーン数 常に1 */ 24 UINT16 biBitCount; /* 色ビット数[bit] 1,4,8,(16),24,32 */ 25 UINT32 biCompression; /* 圧縮形式 0,1,2,3 */ 26 UINT32 biSizeImage; /* 画像データサイズ[byte] */ 27 UINT32 biXPixPerMeter; /* 水平解像度[dot/m] */ 28 UINT32 biYPixPerMeter; /* 垂直解像度[dot/m] */ 29 UINT32 biClrUsed; /* 格納パレット数[使用色数] */ 30 UINT32 biCirImportant; /* 重要なパレットのインデックス */ 31}BITMAPINFOHEADER; 32 33int main(){ 34 FILE *fp; 35 BYTE *pBmpData = NULL; 36 size_t rdsize; 37 fpos_t fsize = 0; 38 BITMAPFILEHEADER bmfh, *pbmfh; 39 BITMAPINFOHEADER bmih, *pbmih; 40 41 if (fopen_s(&fp, "hogehoge.bmp", "rb") != 0){ 42 printf("Read File Open Error. \n"); 43 return -1; 44 } 45 46 /* get file size */ 47 fseek(fp, 0, SEEK_END); 48 fgetpos(fp, &fsize); 49 fseek(fp, 0, SEEK_SET); 50 51 /* allocate memory */ 52 pBmpData = (BYTE*)malloc(sizeof(BYTE) * (size_t)fsize); 53 if (pBmpData == NULL){ 54 return -1; 55 } 56 /* read Bitmap file */ 57 rdsize = fread(pBmpData, sizeof(BYTE), (size_t)fsize, fp); 58 if (rdsize != fsize) { 59 return -1; 60 } 61 62 63#if 0 64 // これも駄目 65 memcpy(pbmfh, pBmpData, sizeof(BITMAPFILEHEADER)); 66 memcpy(pbmfh, pBmpData + sizeof(BITMAPFILEHEADER), sizeof(BITMAPINFOHEADER)); 67#else 68 // これも駄目 69 pbmfh = (BITMAPFILEHEADER*)(pBmpData); 70 pbmih = (BITMAPINFOHEADER*)(pBmpData + sizeof(BITMAPFILEHEADER)); 71 72 // これも駄目 73 bmfh = *((BITMAPFILEHEADER*)(pBmpData)); 74 bmih = *((BITMAPINFOHEADER*)(pBmpData + sizeof(BITMAPFILEHEADER))); 75#endif 76 /* BITMAPFILEHEADER */ 77 printf("bfType = 0x%x\n", pbmfh->bfType); 78 printf("bfSize = 0x%x\n", pbmfh->bfSize); 79 printf("bfReserved1= 0x%x\n", pbmfh->bfReserved1); 80 printf("bfReserved2= 0x%x\n", pbmfh->bfReserved2); 81 printf("bfOffBits = 0x%x\n", pbmfh->bfOffBits); 82 83 /* BITMAPINFOHEADER */ 84 printf("biSize = 0x%x\n", pbmih->biSize); 85 printf("biWidth = 0x%x\n", pbmih->biWidth); 86 printf("biHeight = 0x%x\n", pbmih->biHeight); 87 printf("biPlanes = 0x%x\n", pbmih->biPlanes); 88 printf("biBitCount = 0x%x\n", pbmih->biBitCount); 89 printf("biCompression = 0x%x\n", pbmih->biCompression); 90 printf("biSizeImage = 0x%x\n", pbmih->biSizeImage); 91 printf("biXPixPerMeter= 0x%x\n", pbmih->biXPixPerMeter); 92 printf("biYPixPerMeter= 0x%x\n", pbmih->biYPixPerMeter); 93 printf("biClrUsed = 0x%x\n", pbmih->biClrUsed); 94 printf("biCirImportant= 0x%x\n", pbmih->biCirImportant); 95 96 return 0; 97}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/10 12:29
2015/04/11 13:06