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