00001 #ifndef _AnImage_H
00002 #define _AnImage_H
00003 
00004 #include <stdio.h>
00005 
00006 
00007 
00026 class RImage;                           
00027 class Real3CImage;                      
00028 
00029 class FImage;                           
00030 class Float3CImage;                     
00031 
00032 class CImage;                           
00033 class C3CImage;                         
00034 
00035 enum  AnImageType { 
00036                 ByteIm=0, 
00037                 ShortIm=1,                      
00038                 UShortIm=2, 
00039                 IntIm=3 , 
00040                 RGBIm=10,
00041                 ARGBIm=11,
00042                 RGBs16Im=12,            
00043                 RGB16Im=20, 
00044                 RGBs32Im=22,            
00045                 UnknownIm=255
00046                 };
00047 
00048 class AnImage
00049 {
00050 protected:
00051 
00052 AnImageType                     type;
00053 
00054 int                                     x0, y0;                 
00055 
00056 
00057 int                                     width;  
00058 int                                     height;         
00059 
00060 int                                     nchannels;              
00061 int                                     pixelSize;              
00062 int                                     channelSize;    
00063 
00064 int                                     padding;
00065 
00066 int                                     lineSizeInBytes;   
00067 
00068         
00069 double                          PI;             
00070 
00072 int                                     maskValue;                      
00073 
00074 public:
00075 
00076 AnImage(int w, int h);
00077 AnImage(int w, int h, int channels);
00078 AnImage(int w, int h, int channels, int apixelSize, int achannelSize=1);
00079 virtual ~AnImage(){}
00080 
00081 virtual AnImageType getType(){ return type; }
00082 
00083 virtual AnImage* copy()=0;
00084 virtual AnImage* scaleDown(int multiplier=2)=0;
00085 virtual AnImage* scaleUp(int multiplier=2)=0;
00086 virtual AnImage* scaleUp(int multiplier, int r, int g, int b){return 0;}
00087 
00088 virtual AnImage* zeroInterleaving()=0;
00089 
00090 virtual AnImage* flipHorizontal();
00091 virtual AnImage* flipVertical();
00092 
00093 virtual AnImage* rotate90Left()=0;
00094 virtual AnImage* rotate90Right()=0;
00095 virtual AnImage* rotate180();
00096 
00097 virtual int available8BitsColors(){ return -1; }
00098 
00099 
00100 virtual void set(CImage& data, int ctype=0, int ch=0)=0;
00101 virtual void set(C3CImage& data, int ctype=0);
00102 
00103 virtual void set(RImage& data, int ch=0)=0;
00104 virtual void set(Real3CImage& data);
00105 
00106 virtual void set(FImage& data, int ch=0)=0;
00107 virtual void set(Float3CImage& data);
00108 
00109 virtual void setChannel(AnImage* channel, int ch=0){}
00110 
00111 virtual void setData(AnImage* src, AnImage* mask=0);
00112 virtual void setValues(unsigned char value){}
00113 virtual void setValues(int r, int g, int b);
00114 
00115 virtual int  getMaskValue(){return maskValue;}
00116 virtual void setMaskValue(int value){maskValue= value;}
00117 
00118 virtual AnImage* partImage(int x0=0, int y0=0, int w=256, int h=256)=0;
00119 virtual AnImage* subImage(int x0, int y0, int x1, int y1)=0;
00120 virtual AnImage* smallImage(double xscale, double yscale)=0;
00121 virtual AnImage* smallImage(int newWidth){return 0; }
00122 
00123 virtual void setOrigin(int xorig, int yorig){ x0= xorig; y0= yorig; }
00124 virtual int getX0(){ return x0; }
00125 virtual int getY0(){ return y0; }
00126 
00127 virtual void set(AnImage* image);
00128 
00129 virtual unsigned char* getData()=0;
00130 
00131 
00132 virtual int getMinBoundaryValue(){ return 0; }
00133 virtual int getMaxBoundaryValue(){ return 255; }
00134 virtual int getPower2MaxRangeBoundary(){ return 8; }
00135 
00136 int getWidth() const { return width; }  
00137 int getHeight() const { return height; }
00138 int getChannels(){ return nchannels; }
00139 int getPixelSize(){ return pixelSize; }
00140 int getChannelSize(){ return channelSize; }
00141 int getPadding(){ return padding; }
00142 
00143 int getByteSize(){ return size()*channelSize; }         
00144 
00145 int size(){ return width*height*nchannels; }
00146 
00147 virtual void setRed(int x, int y, int value)=0;
00148 virtual void setGreen(int x, int y, int value)=0;
00149 virtual void setBlue(int x, int y, int value)=0;
00150 virtual void setGrey(int x, int y, int value)=0;
00151 
00152 virtual void setRGB(int x, int y, int r, int g, int b)=0;
00153 virtual void set(int x, int y, int value)=0;
00154 
00155 virtual void setColor(int c, int x, int y, int val)
00156         {
00157         switch( c )
00158                 {
00159                 case 0:
00160                         setRed(x, y, val);
00161                         break;
00162                 case 1:
00163                         setGreen(x, y, val);
00164                         break; 
00165                 case 2:
00166                         setBlue(x, y, val);
00167                         break; 
00168                 default:
00169                         setRed(x, y, val);
00170                         break;
00171                 }
00172         }
00173 
00174 virtual int getRed(int x, int y)=0;
00175 virtual int getGreen(int x, int y)=0;
00176 virtual int getBlue(int x, int y)=0;
00177 virtual int getGrey(int x, int y)=0;
00178 
00179 virtual int get(int x, int y){ return getGrey(x,y); }
00180 virtual int get(int c, int x, int y)
00181         {
00182         int val=0;
00183         switch( c )
00184                 {
00185                 case 0:
00186                         val= getRed(x, y);
00187                         break;
00188                 case 1:
00189                         val= getGreen(x, y);
00190                         break; 
00191                 case 2:
00192                         val= getBlue(x, y);
00193                         break;
00194                 default:
00195                         val= getRed(x, y);
00196                         break; 
00197                 }
00198         return val;
00199         }
00200 
00201 
00202 virtual int getGrey(int x, int y, int dx, int dy){ return getGrey(x*dx,y*dy); }
00203 virtual int getRed(int x, int y, int dx, int dy){ return getGrey(x*dx,y*dy); }
00204 virtual int getGreen(int x, int y, int dx, int dy){ return getGrey(x*dx,y*dy); }
00205 virtual int getBlue(int x, int y, int dx, int dy){ return getGrey(x*dx,y*dy); }
00206 
00207 virtual void setGrey(int x, int y, int dx, int dy, int value)
00208                 { setGrey(x*dx,y*dy, value); }
00209 virtual void setRed(int x, int y, int dx, int dy, int value)
00210                 { setRed(x*dx,y*dy, value); }
00211 virtual void setGreen(int x, int y, int dx, int dy, int value)
00212                 { setGreen(x*dx,y*dy, value); }
00213 virtual void setBlue(int x, int y, int dx, int dy, int value)
00214                 { setBlue(x*dx,y*dy, value); }
00215 
00216 virtual void replace(int pixel, int newPixel=0);
00217 virtual void replace(int red, int green, int blue, int newPixel=0);
00218 virtual void replace(int red, int green, int blue, int newR, int newG, int newB);
00219 
00220 virtual void setRgbFromLhs(int x,int y, double luminance, double hue, double saturation );
00221 virtual void setRgbFromYiq(int x,int y, double Y, double I, double Q );
00222 
00223 
00224 int getLineLength(){ return width; }
00225 int getLineByteSize(){ return lineSizeInBytes; }
00226 
00227 virtual void report(FILE* file);
00228 
00229 virtual void output();
00230 
00231 
00232 virtual void restaure(int model, int type, int iterations, double coeff)
00233                         { restaure(model, 1, type, iterations, coeff); }  
00234 virtual void restaure(int model, int chMode,int type, 
00235                                           int iterations, double coeff, double rsat=0.5)
00236                         { restaure(type, iterations, coeff); } 
00237 
00238 virtual void restaure(int type, int iterations, double coeff){}
00239 virtual void restaureLHS(int type, int iterations, double coeff, double rsat)
00240                                 { restaure(type, iterations, coeff); } 
00241 virtual void restaureYIQ(int type, int iterations, double coeff)
00242                                 { restaure(type, iterations, coeff); } 
00243 
00244 };
00245 
00246 #endif