www.pudn.com > OpenGL32.rar > bitmap.h
#include#include #include #define BITMAP_ID 0x4D42 // the universal bitmap ID /***************************************************************************** LoadBitmapFile() Returns a pointer to the bitmap image of the bitmap specified by filename. Also returns the bitmap header information. No support for 8-bit bitmaps. *****************************************************************************/ unsigned char *LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader) { FILE *filePtr; // the file pointer BITMAPFILEHEADER bitmapFileHeader; // bitmap file header unsigned char *bitmapImage; // bitmap image data unsigned int imageIdx = 0; // image index counter unsigned char tempRGB; // swap variable // open filename in "read binary" mode filePtr = fopen(filename, "rb"); if (filePtr == NULL) return NULL; // read the bitmap file header fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr); // verify that this is a bitmap by checking for the universal bitmap id if (bitmapFileHeader.bfType != BITMAP_ID) { fclose(filePtr); return NULL; } // read the bitmap information header fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr); // move file pointer to beginning of bitmap data fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET); // allocate enough memory for the bitmap image data bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage); // verify memory allocation if (!bitmapImage) { free(bitmapImage); fclose(filePtr); return NULL; } // read in the bitmap image data fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr); // make sure bitmap image data was read if (bitmapImage == NULL) { fclose(filePtr); return NULL; } // swap the R and B values to get RGB since the bitmap color format is in BGR for (imageIdx = 0; imageIdx < bitmapInfoHeader->biSizeImage; imageIdx+=3) { tempRGB = bitmapImage[imageIdx]; bitmapImage[imageIdx] = bitmapImage[imageIdx + 2]; bitmapImage[imageIdx + 2] = tempRGB; } // close the file and return the bitmap image data fclose(filePtr); return bitmapImage; } // end LoadBitmapFile() /***************************************************************************** LoadBitmapFileWithAlpha Loads a bitmap file normally, and then adds an alpha component to use for blending *****************************************************************************/ unsigned char *LoadBitmapFileWithAlpha(char *filename, BITMAPINFOHEADER *bitmapInfoHeader) { unsigned char *bitmapImage = LoadBitmapFile(filename, bitmapInfoHeader); unsigned char *bitmapWithAlpha = (unsigned char *)malloc(bitmapInfoHeader->biSizeImage * 4 / 3); if (bitmapImage == NULL || bitmapWithAlpha == NULL) return NULL; // loop through the bitmap data for (unsigned int src = 0, dst = 0; src < bitmapInfoHeader->biSizeImage; src +=3, dst +=4) { // if the pixel is black, set the alpha to 0. Otherwise, set it to 255. if (bitmapImage[src] == 0 && bitmapImage[src+1] == 0 && bitmapImage[src+2] == 0) bitmapWithAlpha[dst+3] = 0; else bitmapWithAlpha[dst+3] = 0xFF; // copy pixel data over bitmapWithAlpha[dst] = bitmapImage[src]; bitmapWithAlpha[dst+1] = bitmapImage[src+1]; bitmapWithAlpha[dst+2] = bitmapImage[src+2]; } free(bitmapImage); return bitmapWithAlpha; } // end LoadBitmapFileWithAlpha()