[英]Parse/Read Bitmap file in C
我正在嘗試制作一個程序來從位圖文件(.bmp,Windows 文件格式,8 位)中讀取數據。 現在我一直在閱讀圖像數據之前的標題。
我使用我在這里找到的 bmp 規范來制作這些結構來保存 bmp 的文件頭、信息頭和圖像數據:
typedef struct {
unsigned char fileMarker1;
unsigned char fileMarker2;
unsigned int bfSize;
uint16_t unused1;
uint16_t unused2;
unsigned int imageDataOffset;
} FILEHEADER;
typedef struct {
unsigned int biSize;
int width;
int height;
uint16_t planes;
uint16_t bitPix;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} INFOHEADER;
typedef struct {
unsigned char b;
unsigned char g;
unsigned char r;
} IMAGE;
我真的看不出這些有什么問題(除非我的規范來源是錯誤的,但我已經看過別處,在我看來沒問題)。
我正在使用以下代碼來測試它是否被正確解析:
int main(void) {
FILEHEADER fh;
INFOHEADER ih;
FILE *img = fopen("img.bmp", "rb");
fread(&fh, sizeof(unsigned char), sizeof(FILEHEADER), img);
fread(&ih, sizeof(unsigned char), sizeof(INFOHEADER), img);
printf("fM1 = %c, fM2 = %c, bfS = %u, un1 = %hu, un2 = %hu, iDO = %u\n", fh.fileMarker1, fh.fileMarker2, fh.bfSize, fh.unused1, fh.unused2, fh.imageDataOffset);
printf("w = %d, h = %d\n", ih.width, ih.height);
return 0;
}
不幸的是,當我運行它時,我得到了錯誤的結果:
User$ ./images
fM1 = B, fM2 = M, bfS = 0, un1 = 0, un2 = 118, iDO = 2621440
w = 3276800, h = 65536
根據該鏈接,unused1 和 2 應始終為 0。此外,寬度和高度完全錯誤(它是 16x16 圖像)。
這些結構似乎存在某種對齊問題。 有人對這個有經驗么? (我不想使用任何圖像/位圖庫,我想自己完成所有這些)。
謝謝你的幫助!
是的,我忘了打包結構。 這可以解決問題。 哎呀:
typedef struct __attribute__((__packed__)) {
unsigned char fileMarker1;
unsigned char fileMarker2;
unsigned int bfSize;
uint16_t unused1;
uint16_t unused2;
unsigned int imageDataOffset;
} FILEHEADER;
typedef struct __attribute__((__packed__)) {
unsigned int biSize;
int width;
int height;
uint16_t planes;
uint16_t bitPix;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} INFOHEADER;
typedef struct __attribute__((__packed__)) {
unsigned char b;
unsigned char g;
unsigned char r;
} IMAGE;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.