View Full Version : Q: Bitmap Loading Suggestions

04-14-2005, 07:23 AM
Hi all.
I've been all over the net looking for an nice, easy way to load a windows bitmap (.bmp) file.

I am developing under linux, but I want to learn to code in a portable fashion, and keep windows/mac/linux port coding as minimal as possible.

I've definitely seen that glaux is NOT the way to go, and apparently it isn't an option for me on linux anyway.

I haven't found a tutorial or reference on how to actually manually load a .bmp file though, so I was hoping perhaps someone could point me to a nice C code referece/tutorial/howto on this subject.

Any help would be appreciated.



04-14-2005, 09:51 AM
1. Convert to a compressed Targa. It takes up less space than an uncompressed BMP. Compressed BMPs are difficult to decode IMO. The GIMP can convert the files for you.
2. Load the targa file. This will get you started: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=33

04-14-2005, 08:16 PM
First there is the bitmap file header:

typedef struct tagBITMAPFILEHEADER {
WORD bfType; // 2 chars "BM"
DWORD bfSize; // size of file
WORD bfReserved1; // reserved always 0
WORD bfReserved2; // same
DWORD bfOffBits; // sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)[+sizeof(colorpalette) if there is one]
} BITMAPFILEHEADER, *PBITMAPFILEHEADER; then the bitmap info header:

typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // size of this struct
LONG biWidth; // image width (in pixels)
LONG biHeight; // image height (in pixels)
WORD biPlanes; // always 1
WORD biBitCount; // bits per pixel
DWORD biCompression; //compression
DWORD biSizeImage; // size of image in bytes
LONG biXPelsPerMeter; // crap
LONG biYPelsPerMeter; // more crap
DWORD biClrUsed; //
DWORD biClrImportant; //
} BITMAPINFOHEADER, *PBITMAPINFOHEADER; for more info see MSDN :( (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_1rw2.asp)
then the palette (only if bpp is 1, 4 or 8)
basicaly an array of

typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD; then the image.
note that the number of BYTES in a scanline must be a multiple of 4 (DWORD aligned)
i.e. for an uncompressed 24 bpp image
BGR BGR BGR BGR <-- 12 bytes it is DWORD aligned
BGR BGR <-- 6 bytes NOT DWORD aligned so it is padded like that:
BGR BGR 00 <-- 8 bytes - DWORD aligned.
So, for uncompressed or RLE compredded bitmaps, it is not very difficult to write a function that loads them.

04-15-2005, 03:34 AM
T101 that info will help me in the future I would imagine so thanks.

uruk that's exactly what I was looking for, my brain farted and I couldn't think of the right place to look for the specs.
Thanks so very much!


04-16-2005, 02:45 PM

...Worked great for me, and I'm running it on Linux. If you want to use his source, make sure you download the latest one in the zip package (the one in the tutorial has a couple bugs).