Thread: Problem reading from bitmap

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Dr Dipshi++ mike_g's Avatar
    Join Date
    Oct 2006
    Location
    On me hyperplane
    Posts
    1,218

    Problem reading from bitmap

    I'm making a prog that converts a bitmap to a kind of binary stencil.

    The data that gets written is the image width, followed by a bool signaling if the first pixel is on or not. The data after that is written as a sequence of short values each saying how many pixels to draw or skip.

    My problem is that only 3 bytes are being written to the file and the on-off states never seem to flip. I added some debug output and it displays the first pixel on my bmp to have a value of 2293488 when it is black and should be 0.

    The problem should be in the highlighted area. Also to test it there needs to be a 24bit bitmap image in the same directory called "test.bmp".
    Code:
    #include <iostream>
    #include <fstream>
    using namespace::std;
    bool Convert(const char*, const char*);
    
    int main()
    {
        if(! Convert("test.bmp", "result.dat"))
            cout << "Error";
        else
            cout << "Success";
        cin.ignore();
    }
    
    // Converts 24bit bmp data to compressed format
    bool Convert(const char* bmpFile, const char* outFile)
    {	
    	short w, h;
    	char bytes[3];
            bool state;
    	int count =0;
    
    	//Set up streams
    	ifstream in;
    	ofstream out;
    	in.open(bmpFile, ios::binary);
    	if(! in.is_open()) return false;
    	out.open(outFile, ios::out);
    
    	//Write the image width
    	in.seekg(18, ios::beg);
    	in.read((char *)&w, sizeof w);
    	in.seekg(22, ios::beg);
            out.write(bytes, 2);
    	in.read((char *)&h, sizeof h);
            cout << "Width: " << w << endl;
            cout << "Height: " << h << endl;
    
    	//Write if first pixel is on or not
    	in.seekg(54,ios::beg);
    	in.read(bytes, 3);
    	
            if(bytes)
                    state = true;
    	else
    		state = false;
    
            out.write((char*)&state, 1);
            cout << "Pix 1: " << ((int)bytes & 0x00FFFFFF) << endl;
            cout << "State: " << state << endl;
    
    	in.seekg(54, ios::beg);
    	for(int y=h; y>0; y--)
    	{
    		for(int x=0; x<w; x++)
    		{		
    			in.read((char*)&bytes, 3);          
    			if(state)
    			{
    				if(bytes)	
    				{
    					count++;
    				}
    				else
    				{					
    					out.write((char*)&count, 2);		
                                            cout << "On: " << count << endl;
                                            count = 1;
                                            state = false;
    				}
    			}
    			else
    			{
    				if(!bytes)
    				{
    					count++;
    				}
    				else
    				{					
    					out.write((char*)&count, 2);
                                            cout << "Off: " << count << endl;
    					count = 1;
                                            state = true;
    				}
    			}
    		}
    	}
            cout << "Counter at: " << count << endl;
    	in.close();
            out.close();
    	return true;
    }/**/
    Cheers.
    Last edited by mike_g; 02-03-2008 at 02:22 PM.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. 32 bit color depth bitmap problem with XP
    By kalabala in forum C++ Programming
    Replies: 0
    Last Post: 12-22-2008, 06:56 AM
  2. Problem reading input
    By gp364481 in forum C Programming
    Replies: 3
    Last Post: 09-24-2008, 05:10 PM
  3. Problem Reading Process Memory
    By carrotcake1029 in forum C Programming
    Replies: 12
    Last Post: 04-14-2008, 10:33 AM
  4. Problem in reading Character
    By Bargi in forum C Programming
    Replies: 5
    Last Post: 04-10-2008, 11:40 PM
  5. Problem With My Bitmap
    By Sebastiani in forum Windows Programming
    Replies: 9
    Last Post: 10-29-2001, 09:54 PM