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
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);
00029 void Write(const char * filename,int magicnumber=PPM);
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
00041 void Read(char * filename);
00042 void Write(char * filename,int magicnumber);
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 );
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();
00088
00089 switch( MN){
00090 case 3:
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:
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:
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:
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
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:
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:
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:
00153 for(i=0; i<size(); i++)
00154 fout << m_CMatrix[i] << ' ';
00155 break;
00156 case 5:
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 );
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();
00205 unsigned char * tempbuffer;
00206 switch( MN)
00207 case 3:
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:
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:
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:
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
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:
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:
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:
00277 for(i=0; i<size(); i++)
00278 fout << m_CMatrix[i].intensity() << ' ';
00279 break;
00280 case 5:
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 }