2016-01-19 17 views
0

我有一個關於如何讀取位圖頭文件的簡單問題。在C中指定位圖文件中的十六進制值

我有位圖陣列是這樣的:

typedef unsigned char byte; 
char bitmap[(188*180)+1024+54]; //The image size is 188*180 + the header file of 54 bytes+ the pallete table´s 1024 bytes 

I'm根據BMP頭指定的值,但具有that's比一個字節大的值時,我有一個問題。例如,我的圖像寬度爲128,十六進制爲0x120。不過,我不能簡單地說:

bitmap[19] = 0x120; 

因爲that's大於一個字節。根據我閱讀的內容,我有一個雙字來存儲我的圖像高度(即4個字節),因此我可以使用bitmap[20],bitmap[21]bitmap[22]來存儲整個數字。

我該如何劃分數字以獲得存儲在頭文件中的相同值?我不確定在打開bmp文件時是否添加或讀取了單個十六進制數字。

+0

查找描述位圖頭的'struct'定義,並注意字節順序。你*可以*將數字分割成字節,但是字節順序仍然是一個問題。 –

+0

在C中,標準字節與'char'相同,所以'typedef'明確無用,令人困惑。如果打算使用8位類型(即八位字節),請注意一個字節不一定有8位。對於固定寬度(和特定編碼)使用'stint.h'類型。還要注意'char'沒有標準符號。 – Olaf

+0

您還需要研究「每像素位數」(您的是8位)和「跨度」,因爲位圖行長度可能會大於圖像寬度。 –

回答

1

TL; DR

的值被讀出作爲單一DWORD(32位)數。


BMP文件格式是在Wikipedia在互聯網上的許多地方所描述的,以及。請注意正確的偏移量是18,而不是你在你的問題中建議的19。因此,四個字節是在偏移18,19,20和21

在您的代碼:

typedef unsigned char byte; 
char bitmap[(188*180)+1024+54]; 

到圖像的寬度強制0x120,你可以這樣做:

bitmap[18] = 0x20; 
bitmap[19] = 0x01; 
bitmap[20] = 0x00; 
bitmap[21] = 0x00; 

或者在一般情況下:

uint32_t width = ...; // 0x120 in your case, any value in general case 
bitmap[18] = width & 0xff; 
bitmap[19] = (width >> 8) & 0xff; 
bitmap[20] = (width >> 16) & 0xff; 
bitmap[21] = (width >> 24) & 0xff; 

注意,最不顯著字節應該在LO wer地址(little-endian順序) - 這不總是記錄在案,但在Windows中討論數據結構時總是暗示它。

+0

感謝您的回答。這正是我需要的! –