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