Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

CImage

Go to the documentation of this file.
00001  #ifndef CIMAGE_CLASS
00002  #define CIMAGE_CLASS
00003  #define FOREGROUND_COLOR M_RGB888(0,255,0)
00004  
00005  #include "cmatrix"
00006  #include <ctype.h>
00007  #include <fstream.h>
00008  //#include <mil.h>
00009  #include <stdlib.h>
00010  #include "CPixel"
00011  #define PPM 6
00012  
00013  #define PGM 5
00014  
00015  #define ASCIIPPM 3
00016  
00017  #define ASCIIPGM 2
00018  
00019  #define BINARYPPM 6
00020  
00021  #define BINARYPGM 5
00022  class ColorImage : public CMatrix< CPixel<T> >
00023  {
00024  public:
00025          ColorImage();
00026          ColorImage(int x, int y);
00027          ColorImage(char * filename);
00028          void Read(const char * filename); //Reads in a ppm or pgm  It figures out the type based upon the magic number.
00029          void Write(const char * filename,int magicnumber=PPM); //Writes an image based upon its magic number; 
00030                  
00031  };
00032 
00033 class GreyImage : public CMatrix<T>
00034  {
00035  public:
00036          GreyImage();
00037          GreyImage(int x, int y);
00038          GreyImage(char * filename);
00039          ~GreyImage();
00040  //IO Operations:
00041          void Read(char * filename); //Reads in a ppm or pgm  It figures out the type based upon the magic number.
00042          void Write(char * filename,int magicnumber); //Writes an image based upon its magic number; 
00043  };
00044 
00045 
00046  template <typename T>
00047  GreyImage<T>::GreyImage()
00048  {
00049          CMatrix<T>();
00050  }
00051  
00052  template <typename T>
00053  GreyImage<T>::GreyImage(int x, int y)
00054  {
00055          CMatrix<T>(x, y);
00056  }
00057  
00058  template <typename T>
00059  GreyImage<T>::GreyImage(char * filename)
00060  {
00061          Read(filename);
00062  }                                               
00063  template<typename T>
00064  void GreyImage<T>::Read(char * filename)
00065  {
00066  
00067          ifstream fin( filename, ios::in | ios::binary | ios::nocreate );
00068          if( fin.fail() )
00069          {  
00070                  cerr << "Fail to open input file " << filename << " in ppm::read()" << endl;
00071                  exit( -4272 );
00072          }
00073  
00074      char magicNumber[2],comment[81];
00075          int MN,xmax,ymax,image_max;             
00076          unsigned int x,y,z,i;
00077      unsigned char * tempbuffer;
00078      fin.getline( magicNumber, 10);
00079          MN=atoi(magicNumber+1);
00080      while( fin.peek() == '#' )  fin.getline( comment, 81 );  //remove comments
00081          while( !isdigit( (int)fin.peek() ) )
00082                  fin.get(magicNumber[1]);
00083      fin >> xmax >> ymax >> image_max;
00084          if((unsigned)xmax!=TotX || (unsigned)ymax!=TotY)
00085                  SetSize(xmax,ymax);
00086          while(fin.peek()!='\n') fin.get();
00087          fin.get(); //remove extra newline
00088  
00089      switch( MN){
00090          case 3: //ASCII PPM
00091                  for (i=0; i<size(); i++ )
00092                  {
00093                          fin >> x >> y >> z; 
00094                          m_CMatrix[i] = (T)(x+y+z)/3.0;
00095                  };
00096                  break;
00097      case 6: //BINARY PPM
00098                  tempbuffer = new unsigned char[size()*3];
00099                  fin.read(tempbuffer, size()*3);
00100          for (i=0; i<size(); i++ )
00101                  {   
00102                          m_CMatrix[i]=(tempbuffer[i*3]+ tempbuffer[i*3+1]+ tempbuffer[i*3+2])/3;  
00103                  }
00104                  delete [] tempbuffer; 
00105                  break;
00106          case 2: //ASCII PGM
00107                  int input;
00108                  for (i=0; i<size(); i++)
00109                  {
00110                          fin >> input;
00111                          m_CMatrix[i] = input;
00112                  }
00113                  break;
00114          case 5: //BINARY PGM
00115                  tempbuffer = new unsigned char[size()];
00116                  fin.read(tempbuffer, size());
00117                  for(i=0; i<size(); i++)
00118                          m_CMatrix[i]=tempbuffer[i];
00119                  break;
00120  //functionality not added for the pbm class.  Maybe later.  Its just not important.
00121          fin.close();
00122          }
00123  }
00124  
00125  template <typename T>
00126  void GreyImage<T>::Write(char *filename, int magicnumber)
00127  {
00128          int i,j;
00129          assert(size()>0);
00130          fstream fout( filename, ios::out | ios::binary );
00131          if( fout.fail() )
00132          {
00133                  cerr << "Error opening output file ColorImage::Write()" << endl;
00134                  cerr << "exit w/ error code -1345" << endl;
00135                  exit( -1345 );
00136          }
00137          fout << "P" << magicnumber << endl << x() << ' ' << y() << endl << 255 << endl;
00138          switch(magicnumber)
00139          {
00140          case 3: //ASCII PPM
00141                  for(i=0; i<size(); i++ )
00142                          fout << (int)m_CMatrix[i] << ' ' << (int)m_CMatrix[i] << ' ' << (int)m_CMatrix[i] << ' ';
00143                  break;
00144          case 6: //BINARY PPM
00145                  char* tempbuffer;
00146                  tempbuffer = new char[size()*3];
00147                          for(i=0; i<size(); i++)
00148                                  for(j=0; j<size(); j++)
00149                                          tempbuffer[i*3+j]=m_CMatrix[i];
00150                  fout.write(tempbuffer,(size()*3));
00151                  break;
00152          case 2: //ASCII PGM
00153                  for(i=0; i<size(); i++)
00154                          fout << m_CMatrix[i] << ' ';
00155                  break;
00156          case 5: //BINARY PGM
00157                  tempbuffer = new char[size()];
00158                  for(i=0; i<size(); i++)
00159                          tempbuffer[i]=m_CMatrix[i];
00160                  fout.write(tempbuffer, size());
00161                  break;
00162          }
00163  }
00164  template<typename T>
00165  ColorImage<T>::ColorImage()
00166  {
00167          CMatrix<CPixel<T> >();
00168  }
00169  
00170  
00171  template<typename T>
00172  ColorImage<T>::ColorImage(int x, int y)
00173  {
00174          CMatrix<CPixel<T> >(x, y);
00175  }
00176  
00177  template<typename T>
00178  ColorImage<T>::ColorImage(char *filename)
00179  {
00180          Read(filename);
00181  }
00182  template<typename T>
00183  void ColorImage<T>::Read(const char * filename)
00184  {
00185          fstream fin( filename, ios::in | ios::binary | ios::nocreate );
00186          if( fin.fail() )
00187          {  
00188                  cerr << "Fail to open input file " << filename << " in ColorImage::read()" << endl;
00189                  exit( -4272 );
00190          }
00191  
00192      char magicNumber[2],comment[81];
00193          int MN,xmax,ymax,image_max;
00194      
00195      fin.getline( magicNumber, 10);
00196          MN=atoi(magicNumber[1]);
00197      while( fin.peek() == '#' )  fin.getline( comment, 81 );  //remove comments
00198          while( !isdigit( (int)fin.peek() ) )
00199                  fin.get(magicNumber[1]);
00200      fin >> xmax >> ymax >> image_max;
00201          if(xmax!=TotX || ymax!=TotY)
00202                  SetSize(xmax,ymax);
00203          while(fin.peek()!='\n') fin.get();
00204          fin.get(); //remove extra newline
00205      unsigned char * tempbuffer;
00206      switch( MN)
00207          case 3: //ASCII PPM
00208                  int x,y,z;
00209                  for ( unsigned int i=0; i<size(); i++ )
00210                  {
00211                          fin >> x >> y >> z; 
00212                          m_CMatrix[i].x=x;
00213                          m_CMatrix[i].y=y;
00214                          m_CMatrix[i].z=z;
00215              }
00216                  break;
00217      case 6: //BINARY PPM
00218                  tempbuffer = new unsigned char[size()*3];
00219                  fin.read(tempbuffer, size()*3);
00220          for ( long i=0; i<size; i++ )
00221                  {   
00222                          m_CMatrix[i]=CPixel<unsigned char>(tempbuffer[i*3], tempbuffer[i*3+1], tempbuffer[i*3+2]);  
00223                  }
00224                  delete [] tempbuffer; 
00225                  break;
00226          case 2: //ASCII PGM
00227                  int input;
00228                  for ( unsigned int i=0; i<size(); i++)
00229                  {
00230                          fin >> input;
00231                          image_data[i] = (unsigned char)input;
00232                  }
00233                  break;
00234          case 5: //BINARY PGM
00235                  tempbuffer = new unsigned char[size()];
00236                  fin.read(tempbuffer, size());
00237                  for( long i=0; i<size(); i++)
00238                          m_CMatrix[i]=tempbuffer[i];
00239                  break;
00240  //functionality not added for the pbm class.  Maybe later.  Its just not important.
00241          fin.close();
00242  }
00243  
00244  
00245  template<typename T>
00246  void ColorImage<T>::Write(const char * filename, int magicnumber)
00247  {
00248          int i;
00249          assert(size()>0);
00250          fstream fout( filename, ios::out | ios::binary );
00251          if( fout.fail() )
00252          {
00253                  cerr << "Error opening output file ColorImage::Write()" << endl;
00254                  cerr << "exit w/ error code -1345" << endl;
00255                  exit( -1345 );
00256          }
00257          fout << "P" << magicnumber << endl << x() << ' ' << y() << endl << 255 << endl;
00258          switch(magicnumber)
00259          {
00260          case 3: //ASCII PPM
00261                  for(i=0; i<size(); i++ )
00262                          fout << int(m_CMatrix[i].x) << ' ' << int(m_CMatrix[i].y) 
00263                                   << ' ' << int(m_CMatrix[i].z) <<' ';
00264                  break;
00265          case 6: //BINARY PPM
00266                  char* tempbuffer;
00267                  tempbuffer = new char[size()*3];
00268                  for(i=0; i<size(); i++)
00269                  {
00270                          tempbuffer[i*3]=m_CMatrix[i].x;
00271                          tempbuffer[i*3+1]=m_CMatrix[i].y; 
00272                          tempbuffer[i*3+2]=m_CMatrix[i].z;
00273                  }
00274                  fout.write(tempbuffer,(size()*3));
00275                  break;
00276          case 2: //ASCII PGM
00277                  for(i=0; i<size(); i++)
00278                          fout << m_CMatrix[i].intensity() << ' ';
00279                  break;
00280          case 5: //BINARY PGM
00281                  tempbuffer = new char[size()];
00282                  for(i=0; i<size(); i++)
00283                          tempbuffer[i]=m_CMatrix[i].intensity();
00284                  fout.write(tempbuffer, size());
00285                  break;
00286          }
00287  }

Generated at Thu Apr 25 20:30:41 2002 for SuperParr by doxygen1.2.9.1 written by Dimitri van Heesch, © 1997-2001