2011-10-12 128 views
0

我最近製作了一個程序來讀取BMP文件的fileheader和infoheader。我如圖所示包裝它們,並將其打印出來並打印寬度和高度。不幸的是,寬度和高度出現不正確。我不知道爲什麼。也許有點/小端問題?如果是這樣,我不知道如何解決它。我正在GCC上編譯和運行它。閱讀BMP頭文件,打包。讀取不正確的值

#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); 
+0

什麼是圖像的實際尺寸,以及您得到的是什麼值。看看他們在十六進制,看看它是否是一個endianess問題 – James

+0

是你的系統大endian?你的系統是什麼? –

+0

是否在讀取圖像數據前先移動到圖像數據的開頭?數據的偏移量在FILEHEADER中指定。 fileMarker1和fileMarker2的值是否正確? – sashang

回答

1

一個Windows位圖文件確實保存作爲小端。因此,假設你的系統是big-endian,你需要在加載之後反轉每個2或4字節int值的字節序。這IBM article描述了各種方式來做到這一點。