This is how you maually load a bmp file
The bitmap file format:
Bitmap file header
Bitmap info header
palette data
Bitmap Dada
so on with the code part, this is our struct we need to create to hold the bitmap file header
the bftype field checks to see if you are infact loading a bmp file, and if you are the field should be 0x4D42.Code:typedef struct tagBITMAPFILEHEADER { WORD bfType; //specifies the file type DWORD bfSize; //specifies the size in bytes of the bitmap file WORD bfReserved1; //reserved; must be 0 WORD bfReserved2; //reserved; must be 0 DWORD bOffBits; //species the offset in bytes from the bitmapfileheader to the bitmap bits }BITMAPFILEHEADER;
Now we need to create our bitmapinfoheader struct. This holds info about our bitmap(self explainitory).
Now on to loading our BitmapCode:typedef struct tagBITMAPINFOHEADER { DWORD biSize; //specifies the number of bytes required by the struct LONG biWidth; //specifies width in pixels LONG biHeight; //species height in pixels WORD biPlanes; //specifies the number of color planes, must be 1 WORD biBitCount; //specifies the number of bit per pixel DWORD biCompression;//spcifies the type of compression DWORD biSizeImage; //size of image in bytes LONG biXPelsPerMeter; //number of pixels per meter in x axis LONG biYPelsPerMeter; //number of pixels per meter in y axis DWORD biClrUsed; //number of colors used by th ebitmap DWORD biClrImportant; //number of colors that are important }BITMAPINFOHEADER;
Now to make use of all of this:Code:unsigned char *LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader) FILE *filePtr; //our file pointer BITMAPFILEHEADER bitmapFileHeader; //our bitmap file header unsigned char *bitmapImage; //store image data int imageIdx=0; //image index counter unsigned char tempRGB; //our 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 bmp file by check bitmap id if (bitmapFileHeader.bfType !=0x4D42) { fclose(filePtr); return NULL; } //read the bitmap info header fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr); //move file point to the begging 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,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 (bitmap is BGR) for (imageIdx = 0,imageIdx < bitmapInfoHeader->biSizeImage;imageIdx+=3) { tempRGB = bitmapImage[imageIdx]; bitmapImage[imageIdx] = bitmapImage[imageIdx + 2]; bitmapImage[imageIdx + 2] = tempRGB; } //close file and return bitmap iamge data fclose(filePtr); return bitmapImage; }
Later on ill put up Writing a to bmp and how to load a targa file and how to display them.Code:BITMAPINFOHEADER bitmapInfoHeader; unsigned char *bitmapData; ... bitmapData = LoadBitmapFile("mypic.bmp",&bitmapInfoHeader); //now do what you want with it, later on i will show you how to display it in a normal window




Reply With Quote