http://GameProgrammer.Com

Programming

GP Mailing List
     Thread Index
     Date Index

ATXGPSIG List
     Thread Index
     Date Index

Google
>

Home

Wise2Food



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: BMP/PCX file specifications



   Thanks for the information.  I can get the bit patterns from the SVGA functions I've already written and can convert pixel formats, but I just don't know what data makes up a BITMAPFILEHEADER and BITMAPINFOHEADER.  I have found formats on the web, but when I implement them, I often find junk in the data fields, which leads me to the conclusion that I am either some fields of the header are bad, I am reading the data in wrong, or I have bad specifications to begin with.  I have tried to skip over the header of a 24 bit bitmap by reading the size of the header from the header struct then reading in the triplet after that, changing to 16 bit color, then going on to the next pixel, but my output is wrong when put to screen.  Again, I don't know where this error comes from. 
    I have also thought about going over to Windows with DirectX.  I have the SDK, and Visual C++.  I am just afraid of taking on the learning curve, but I know I will have to eventually. 
 
Thanks again,
 
Greg
 
Original Message -----
From: Mike Main
Sent: Sunday, October 08, 2000 7:23 PM
Subject: Re: BMP/PCX file specifications

All bitmaps have a standard header which contains all of the specs of the Bitmap.  The size of course isn't important.  Anyways, you need to load in these file headers first using any method necessary.  I start it by making a few variables:
 
BITMAPFILEHEADER bitmapfileheader;
BITMAPINFOHEADER bitmapinfoheader;
UCHAR *buffer;             /*Or unsigned char*/
UCHAR *temp_buffer;    /*Used for storing the 24bit bitmap*/
 
Then the next thing to do is to load in the file header and the info header like so:
 
ifstream in("bitmapfile.bmp");
 
in.read(bitmapfileheader, sizeof(BITMAPFILEHEADER);
in.read(bitmapinfoheader, sizeof(BITMAPINFOHEADER);
 
Then you allocate the buffers.
 
buffer = new UCHAR [2*bitmapinfoheader.biWidth*bitmapinfoheader.biHeight];
temp_buffer = new UCHAR[bitmapinfoheader.biSizeImage];
 
Notice above that how I allocated the space for the final 16bit buffer.  Since 16bit color is 2 bytes per pixel, and there are width*height pixels, that means that the size of the final buffer will be 2*width*he,
ight.  And the temp buffer for the 24bit image is just based on the size of the image data in bits.  Now finally we read in the information:
 
in. seekp(-bitmapinfoheader.biSizeImage, ios::bottom);
in.read(temp_buffer, bitmapinfoheader.biSizeImage);
 
This reads in the image data in 24bits per pixel.  To convert this, use binary shifting for each RGB value.  This is the tricky part.  Most 16bit graphics modes use 5 bits per channel (5 bits for red, 5 bits for green, 5 bits for blue).  But some, especially newer cards use 5 bits for red, 6 bits for green, and 5 bits for blue.  You'll need to find some way to do this.  In Direct X it is easy.  Just use lpdds->GetPixelFormat(&ddpixelformat), and then check ddpixelformat.IGBitMask for it's value.  But here is basically how you would convert it for a 5, 5, 5 mode:
 
for(i=0; i<bitmapinfoheader.biSizeImage; i++)
{
    UCHAR blue=  temp_buffer[index*3+0]>>3,
                green=temp_buffer[index*3+1]>>3,
                red=    temp_buffer[index*3+2]>>3;
 
    USHORT color = (blue+(green<<5)+(red<<10));
 
    ((USHORT)buffer)[index]=color;
}
 
This will load the whole bitmap into the buffer where the final image is stored, and it will be in 16bpp.  That's all I've got.  And this code was written using windows data types, so this won't work in DOS the way I have written it.  And I'm sure that I have errors galore in there, but it's the same BASIC IDEA :) .  Just follow the idea.
----- Original Message -----
Sent: Sunday, October 08, 2000 7:29 PM
Subject: BMP/PCX file specifications

    I am trying to developing a CRPG running under Protected mode DOS using DJGPP.  I have searched the internet for reference materials and have already written a set of routines to handle SVGA graphics.  I am now trying to get a bitmap/pcx loader, however, I have not found much good info.  Can anyone send/refer any file specifications, tutorials, examples, etc.  I have found many bad tutorials but nothing that has answered all of my questions.  I have tried to implement  256 color PCX with limited success.  When reading the byte value and looking up the RGB triplet from the end of the file, there was some error that I could not trace.  I would ideally like to read 24-bit BMPs, however I can always convert files.
  I am using 640x480 16-bit color, but would appreciate any resources that deal with the subject.
 
Thanks,
 
Greg H