Loading A BMP

Started by
5 comments, last by The Reindeer Effect 21 years, 10 months ago
I am having some problems with a little project of mine. I really haven''t learned C file I/O functions the way I should have I assume. Anyways ... I can load the BITMAPFILEHEADER and BITMAPINFOHEADER just fine. Since it is a 24-bit bmp, I assume that means that there is no pallete. So I go directly onto trying to load the pixel data ... but I have no clue how to. I had planned to store the pixel data in - BYTE* pData; Whenever I find the biWidth and biHeight, I do - pData = new BYTE[ 3 * biWidth * biHeight]. Then: temp = 3 * biWidth * biHeight; for( int i = 0; i < temp; i++) fread( &pData, sizeof( BYTE ), 1, in ); for some reason I am having problems ... cuz I impelented a test. I tried to output all the data basically the same way i got it, cept i used fwrite( .. ); When I try to open the file, it says not a current bmp file formay. After tinkering for 20 minutes, I have only managed to make a 593 mb file, the original is like 50k ------------------- The Reindeer Effect
Advertisement
Here's my code for reading Windows bitmaps. It's fairly easy to understand, even though it's very non-standard code:

  using namespace gPixmapFormat;gImageWinBmpHeader Header;gImageWinBmpInfoHeader Info;unsigned int ByteWidth, BytesPP, DataSize, Shift;File.Read(&Header,14,1);File.Read(&Info,40,1);/* This doesn't ever seem to work for me ;)if(Header.OffBits > (14 + 40))	File.Seek(Header.OffBits - (14 + 40),SEEK_CUR);*/// Flip little endian data to native endian datagEndianFixLittle(Header.OffBits);gEndianFixLittle(Header.Type);gEndianFixLittle(Info.Width);gEndianFixLittle(Info.Height);gEndianFixLittle(Info.BitCount);if(Header.Type != 0x4D42) {	gError("This isn't a Win32 bitmap.");}if(Info.BitCount != 24) {	gError("This bit depth isn't supported.");}BytesPP = Info.BitCount/8;ByteWidth = Info.Width * BytesPP;DataSize = ByteWidth * Info.Height;Shift = ByteWidth % 4;This->SetBytesPP(BytesPP);This->SetWidth(Info.Width);This->SetHeight(Info.Height);This->SetData(gNewArray(gByte,DataSize));This->SetFreeMem(true);if(Shift == 0) {	File.Read(This->GetData(),1,DataSize);} else { // Yeah, padding...	for(unsigned int a=0; a<Info.Height; ++a) {		File.Read(This->GetData(),1,ByteWidth);		File.Seek(Shift,SEEK_CUR);	}}This->SetFormat(External::BGR);This->FlipVert();  

About that last part: Are you loading and saving it in binary mode (the default in Windows is text mode)?



[edited by - Null and Void on June 2, 2002 10:10:05 PM]
What headers / libs do I need to use that?

[edited by - The Reindeer Effect on June 2, 2002 10:13:07 PM]
Sorry about the ''update right after I post'' thing, I hit reply too quickly.
quote:Original post by The Reindeer Effect
What headers / libs do I need to use that?

Well, you''d need most of my GTW engine . I was posting it as a ''reference'' for you to go by. Some notes: My file functions are based directly off the C file I/O functions (but they throw exceptions on error), and my gWinBmp*Header structs are just like the Win32 API''s BITMAP*HEADER structs (I needed my own copy to maintain portability).

ttt

-------------------
The Reindeer Effect
Allright, thanks.

-------------------
The Reindeer Effect
AHHHHHHH ... I think it was because I thought that only the pixel data was in little endian.

-------------------
The Reindeer Effect

This topic is closed to new replies.

Advertisement