I found that, when reading the Bitmap File Header and Bitmap Info Header (preceding the pixel data), that I could not read it all in as one header:
Code:
fread(&header, sizeof(header), 1, file);
Even though that is what everyone suggested, and it makes sense that it should work properly, I found I had to resort to reading every value in line by line:
Code:
void CompleteHeader(CUSTOMBITMAPHEADER *BitmapHeader, FILE *BinaryIFile)
{
fread(&(BitmapHeader->Type), sizeof(BitmapHeader->Type), 1, BinaryIFile);
fread(&(BitmapHeader->Size), sizeof(BitmapHeader->Size), 1, BinaryIFile);
fread(&(BitmapHeader->Reserved1), sizeof(BitmapHeader->Reserved1), 1, BinaryIFile);
fread(&(BitmapHeader->Reserved2), sizeof(BitmapHeader->Reserved2), 1, BinaryIFile);
fread(&(BitmapHeader->OffBits), sizeof(BitmapHeader->OffBits), 1, BinaryIFile);
fread(&(BitmapHeader->RemainingSize), sizeof(BitmapHeader->Size), 1, BinaryIFile);
fread(&(BitmapHeader->Width), sizeof(BitmapHeader->Width), 1, BinaryIFile);
fread(&(BitmapHeader->Height), sizeof(BitmapHeader->Height), 1, BinaryIFile);
fread(&(BitmapHeader->Planes), sizeof(BitmapHeader->Planes), 1, BinaryIFile);
fread(&(BitmapHeader->BitCount), sizeof(BitmapHeader->BitCount), 1, BinaryIFile);
fread(&(BitmapHeader->Compression), sizeof(BitmapHeader->Compression), 1, BinaryIFile);
fread(&(BitmapHeader->SizeImage), sizeof(BitmapHeader->SizeImage), 1, BinaryIFile);
fread(&(BitmapHeader->XPelsPerMeter), sizeof(BitmapHeader->XPelsPerMeter), 1, BinaryIFile);
fread(&(BitmapHeader->YPelsPerMeter), sizeof(BitmapHeader->YPelsPerMeter), 1, BinaryIFile);
fread(&(BitmapHeader->ClrUsed), sizeof(BitmapHeader->ClrUsed), 1, BinaryIFile);
fread(&(BitmapHeader->ClrImportant), sizeof(BitmapHeader->ClrImportant), 1, BinaryIFile);
}
Also, to avoid any dependancies on Windows.h (it seemed un-necessary to me), I just defined my own structure:
Code:
struct CUSTOMBITMAPHEADER
{
unsigned short Type;
unsigned long Size;
unsigned short Reserved1;
unsigned short Reserved2;
unsigned long OffBits;
unsigned long RemainingSize;
unsigned long Width;
unsigned long Height;
unsigned short Planes;
unsigned short BitCount;
unsigned long Compression;
unsigned long SizeImage;
unsigned long XPelsPerMeter;
unsigned long YPelsPerMeter;
unsigned long ClrUsed;
unsigned long ClrImportant;
};
A detailed description of the fields can be found on www.brackeen.com, in the VGA Tutorials (Bitmaps and Palettes) Section.