This topic is now archived and is closed to further replies.


Help with Bitmaps, file reading messes up...

Recommended Posts

[EDIT] I uploaded all my code to It messes up the structs when I read it, dunno why. [/EDIT] Hi all, I'm having trouble with my bitmap loading class. Current problem is that it only supports 24-bit bitmaps wich are converted to 16-bit. I also want to be able to convert 24-bits to 32-bit and load 16/32 bit bitmaps. But that's not the problem right now, problem is that my bitmap has the wrong height/width. When I try to create offscreen surface it crashes on that it can't create the offscreen plain. I first thought it was caused by my C++ file I/O but when using C functions it still doesn't work. This is my code:

// L O A D 


// The name says it all. It opens the file and reads the bitmap from it.


int Bitmap::Load(char File[1024], DirectDraw *pDDraw)
    DDSURFACEDESC2       ddsd;
    BITMAP_FILEHEADER    FileHeader;
    BITMAP_INFOHEADER    InfoHeader;
    WORD                 *BitmapData;
    WORD                 *BitmapFlipped;  
    BYTE                 Red, Green, Blue;
    FILE                 *BitmapFile;
//    ifstream             BitmapFile(File, ios::binary);

    CDebug               Log("C:\\bitmap.log");
    char                 Buffer[1024];

    Log.Write("****** LOG FILE ******\n");

    BitmapFile = fopen("C:\\test.bmp", "rb");
    // Read the file header from the file

    fread(&FileHeader, sizeof(BITMAP_FILEHEADER), 1, BitmapFile);
// *)&FileHeader, sizeof(BITMAP_FILEHEADER));

    // Read the InfoHeader from the file

    fread(&InfoHeader, sizeof(BITMAP_INFOHEADER), 1, BitmapFile);
// *)&InfoHeader, sizeof(BITMAP_INFOHEADER));

    sprintf(Buffer, "Infoheader.biWidth = %d\nInfoHeader.biHeight = %d", InfoHeader.biWidth, InfoHeader.biHeight);

    // Create a new surface for the bitmap to be copied to

    BitmapSurface = pDDraw->CreateSurface(InfoHeader.biWidth, InfoHeader.biHeight, 0);
    if (BitmapSurface == NULL)

    // Lock the offscreen surface for access

        return (FAILED_SURFACE_LOCK);

    // Reserve data for the bitmap. BitmapData is for the bitmap read from

    // the file, BitmapFlipped is the mem for the correct bitmap

    BitmapData    = new WORD[InfoHeader.biWidth * InfoHeader.biHeight];
    BitmapFlipped = (WORD *) ddsd.lpSurface;

    // Read the bitmap bit for bit from the file, convert it to 16bit and save it

    for (int Y = 0; Y < InfoHeader.biHeight; ++Y)
        for (int X = 0; X < InfoHeader.biWidth; ++X)
            // Read the 3 pixels from file

            fread(&Blue,  sizeof(BYTE), 1, BitmapFile);
            fread(&Green, sizeof(BYTE), 1, BitmapFile);
            fread(&Red,   sizeof(BYTE), 1, BitmapFile);
//   *)&Blue , sizeof(BYTE));

//   *)&Green, sizeof(BYTE));

//   *)&Red  , sizeof(BYTE));

            // Convert them to 16-bit and them inside the mem

            BitmapData[Y * InfoHeader.biWidth + X] = RGB24TO16(Red, Green, Blue);

    int HeightIndex = 0;

    // Flip the bitmap. 

    for (Y = InfoHeader.biHeight - 1; Y >= 0; --Y)
       for (int X = 0; X < InfoHeader.biWidth; ++X)
          BitmapFlipped[HeightIndex * (ddsd.lPitch / 2) + X] = BitmapData[Y * InfoHeader.biWidth + X];

    // Close the file



    // Clean up the old bitmap data

    delete BitmapData;

    // Unlock the surface


    return (SUCCESS);
When I read a 640*480*24bpp bitmap the log file shows me this:
****** LOG FILE ******

Infoheader.biWidth = 31457280
InfoHeader.biHeight = 65536
Why isn't the function reading correctly? Sand Hawk ---------------- -Earth is 98% full. Please delete anybody you can.
My Site [edited by - sand_hawk on August 15, 2002 12:13:17 PM]

Share this post

Link to post
Share on other sites