Parse / Leggi il file Bitmap in C

Sto cercando di creare un programma per leggere i dati da un file bitmap (.bmp, formato file Windows, 8 bit). In questo momento sono bloccato a leggere le intestazioni prima dei dati dell’immagine.

Ho usato le specifiche per bmp che ho trovato qui per rendere queste strutture per contenere l’intestazione del file, l’intestazione info e i dati immagine del 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; 

Non riesco davvero a vedere nulla di sbagliato in questi (a meno che la mia fonte per le specifiche non sia corretta, ma ho cercato altrove e mi sembra ok).

Sto usando il seguente codice per verificare che venga analizzato correttamente:

 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; } 

Sfortunatamente, quando eseguo questo, ottengo un risultato errato:

 User$ ./images fM1 = B, fM2 = M, bfS = 0, un1 = 0, un2 = 118, iDO = 2621440 w = 3276800, h = 65536 

Secondo quel link, inutilizzato1 e 2 dovrebbero essere sempre 0. Inoltre, la larghezza e l’altezza sono completamente sbagliate (è un’immagine 16×16).

sembra che ci sia una sorta di problema di allineamento con le strutture. Qualcuno ha qualche esperienza con questo? (Non voglio usare alcuna libreria di immagini / bitmap, voglio fare tutto da solo).

Grazie per l’aiuto!

Già mi sono dimenticato di impacchettare le strutture. Questo risolve le cose. oops:

 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;