我測試你的代碼,我沒有問題。 你能提供你想要讀取的BMP文件嗎?
此外,我已經爲您編寫了一些代碼,可以幫助您在項目變大時保持一切組織。我建議把結構放入一個頭文件中。
編輯:必須自己定義結構中的數據類型,因爲我在沒有stdint.h
的環境中執行此操作。抱歉。但你可以改變它們。
您可以使用這些結構來存儲你的頭信息:
typedef struct {
uint16 Signature;
uint32 Size;
uint16 Reserved1;
uint16 Reserved2;
uint32 BitsOffset;
} BITMAP_FILE_HEADER;
typedef struct {
uint32 biSize;
int32 biWidth;
int32 biHeight;
uint16 biPlanes;
uint16 biBitCount;
uint32 biCompression;
uint32 biSizeImage;
int32 biXPelsPerMeter;
int32 biYPelsPerMeter;
uint32 biClrUsed;
uint32 biClrImportant;
} BITMAP_INFO_HEADER;
typedef struct {
uint32 bcSize;
uint16 bcWidth;
uint16 bcHeight;
uint16 bcPlanes;
uint16 bcBitCount;
} BITMAP_CORE_HEADER;
使用此功能來讀取頭
int read_header(FILE* inputfile, BITMAP_INFO_HEADER* header, BITMAP_FILE_HEADER* fHeader) {
BITMAP_FILE_HEADER fileHeader;
BITMAP_INFO_HEADER infoHeader;
BITMAP_CORE_HEADER coreHeader;
uint32 headersize;
fread(&fileHeader.Signature, sizeof(fileHeader.Signature), 1, inputfile);
printf("%d", fileHeader.Signature);
}
,並使用主函數來調用一切和處理錯誤
int main(void) {
FILE* inputfile = NULL;
BITMAP_INFO_HEADER infoHeader = {0};
BITMAP_FILE_HEADER fileHeader = {0};
if ((inputfile = fopen("source.bmp", "rb")) == NULL) {
ERROR("can't open file.")
return 1;
}
if (read_header(inputfile, &infoHeader, &fileHeader) == 0) {
ERROR("Fileformat not supported.")
return 1;
}
}
根據您分配的內容,您可以使用ERROR()
宏以清除所有內容:
#define ERROR(ErrMsg) \
printf("Error: %s\n", ErrMsg); \
if (bitmapData != NULL) \
free(bitmapData); \
if (yourAlloc != NULL) \
free(yourAlloc);
你爲什麼不檢查'fread()'的返回值。 –
也許你應該退出,如果文件沒有打開。 – drescherjm
@Bobby:那麼,您是否檢查了「無法打開文件」消息的輸出? – AnT