0

最近、BMPファイルのファイルヘッダーとインフォヘッダーを読み取るプログラムを作成しました。図のように梱包し、フレッドして、幅と高さを印刷しました。残念ながら、幅と高さが正しくないように表示されます。理由はわかりません。おそらくビット/リトルエンディアンの問題ですか?もしそうなら、私はそれを修正する方法がわかりません。GCCでコンパイルして実行しています。

#pragma pack(1)

typedef struct
{
    unsigned char fileMarker1;       /* 'B' */                       
    unsigned char fileMarker2;       /* 'M' */ 
    unsigned int   bfSize;             
    unsigned short unused1;           
    unsigned short unused2;           
    unsigned int   imageDataOffset;  /* Offset to the start of image data */
 }FILEHEADER;

 typedef struct                       
 { 
    unsigned int   biSize;            
    signed int     width;            /* Width of the image */ 
    signed int     height;           /* Height of the image */ 
    unsigned short planes;             
    unsigned short bitPix;             
    unsigned int   biCompression;      
    unsigned int   biSizeImage;        
    int            biXPelsPerMeter;    
    int            biYPelsPerMeter;    
    unsigned int   biClrUsed;          
    unsigned int   biClrImportant;     
 }INFOHEADER;

 #pragma pack()

....。

 fread( &header, sizeof(FILEHEADER), 1, image );

....。

 fread( &iheader, sizeof(INFOHEADER), 1, image );

....。

 printf("Width: %i\n", iheader.width);
 printf("Height: %i\n", iheader.height);
4

1 に答える 1

1

Windows のビットマップ ファイルは、実際にはリトル エンディアンとして保存されます。したがって、システムがビッグエンディアンであると仮定すると、読み込み後に各 2 または 4 バイトの int 値のエンディアンを逆にする必要があります。このIBM の記事では、そのためのさまざまな方法について説明しています。

于 2011-10-12T10:47:30.727 に答える