Results 1 to 32 of 32

Thread: C/C++ - Loading Bitmap Files (Manually)

Threaded View

  1. #1

    Thread Starter
    Member
    Join Date
    Sep 2003
    Posts
    34

    C/C++ - Loading Bitmap Files (Manually)

    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
    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;
    the bftype field checks to see if you are infact loading a bmp file, and if you are the field should be 0x4D42.

    Now we need to create our bitmapinfoheader struct. This holds info about our bitmap(self explainitory).
    Code:
    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 on to loading our Bitmap
    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;
    }
    Now to make use of all of this:
    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
    Later on ill put up Writing a to bmp and how to load a targa file and how to display them.
    Last edited by BeholderOf; Sep 18th, 2003 at 02:22 PM.
    a 17 year old kid who has nothing better to do !
    and i never said i was right !!!

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width