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

Image.h

Go to the documentation of this file.
00001 /*
00002     File:       Image.h
00003 
00004     Function:   Defines an image: a 2D array of pixels. Provides common
00005                 operations on images.
00006                     
00007     Author(s):  Andrew Willmott
00008 
00009     Copyright:  (c) 1997-2000, Andrew Willmott
00010  */
00011 
00012 
00013 #ifndef __Image__
00014 #define __Image__
00015 
00016 #include "gcl/Colour.h"
00017 #include "cl/FileName.h"
00018 
00019 // --- Useful enums -----------------------------------------------------------
00020 
00021 enum ImgChannel
00022 {
00023     chMono,
00024     chRed,
00025     chGreen,
00026     chBlue,
00027     chAlpha,
00028     chMatte,
00029     chDepth,
00030     chMax = 16
00031 };
00032 
00033 enum ImgStoreType
00034 {
00035     imgByte,
00036     imgUInt16,
00037     imgUInt32,
00038     imgFloat,
00039     imgDouble,
00040     imgFloat3,
00041     imgDouble3,
00042     imgStoreMax
00043 };
00044 
00045 enum 
00046 {
00047     rgba_R = 0,
00048     rgba_G = 1,
00049     rgba_B = 2,
00050     rgba_A = 3
00051 };
00052 
00053 struct RGBAPixel
00054 {
00055     Byte    ch[4];
00056 };
00057 
00058 // Ward's RGB + exponent format
00059 typedef RGBAPixel RGBEPixel;
00060 
00061 enum ImgTag
00062 {
00063     imgRGBATag,
00064     imgByteTag,
00065     imgRGBETag,
00066     imgChannelTag,
00067     imgMaxTags
00068 };
00069 
00070 // --- Generic image class ----------------------------------------------------
00071 
00072 class Image 
00073 {
00074 public:
00075     Image(ImgTag it) : width(0), height(0), tag(it) {};
00076 
00077     virtual Void    SetSize(Int width, Int height) = 0;
00078 
00079     Int             Height() const { return(height); };
00080     Int             Width() const { return(width); };
00081 
00082     virtual Void    Clear(const Colour &c) = 0;
00083     virtual Void    CopyFrom(Int x, Int y, Image &i);
00084 
00085     virtual Void    GammaCorrect(ClrReal gamma = 2.2);
00086     virtual Void    Scale(ClrReal scale);
00087     virtual ClrReal MaxComponent();
00088     virtual Colour  AverageColour();
00089     virtual Void    FindComponentBounds(Colour &min, Colour &max);
00090     virtual Void    Transform(const ClrTrans &trans);
00092     virtual Void    Over(Int x, Int y, Image &i);
00093     virtual Void    DownSample(Image &out);
00094 
00095 // pixel operations
00096     virtual Void    SetPixel(Int x, Int y, const Colour &c) = 0;
00097     virtual Colour  GetPixel(Int x, Int y) const = 0;
00098 
00099     virtual Void    SetRealPixel(Int x, Int y, ClrReal r,
00100                                  ImgChannel channel = chMono);
00101     virtual ClrReal GetRealPixel(Int x, Int y, 
00102                                  ImgChannel channel = chMono) const;
00103 
00104 // span operations
00105     virtual Void    SetSpan(Int row, Int start, Int length, 
00106                             const Colour *src) = 0;
00107     virtual Void    GetSpan(Int row, Int start, Int length, 
00108                             Colour *dst) const = 0;
00109 
00110     virtual Void    SetRGBASpan(Int row, Int start, Int length,
00111                                 const RGBAPixel *src);
00112     virtual Void    GetRGBASpan(Int row, Int start, Int length, 
00113                                 RGBAPixel *dst) const;
00114 
00115     virtual Void    SetRealSpan(Int row, Int start, Int length,
00116                                 const ClrReal *src, ImgChannel channel = chMono);
00117     virtual Void    GetRealSpan(Int row, Int start, Int length,
00118                                 ClrReal *dst, ImgChannel channel = chMono) const;
00119 
00120     virtual Void    SetByteSpan(Int row, Int start, Int length,
00121                                 const Byte *src, ImgChannel channel = chMono);
00122     virtual Void    GetByteSpan(Int row, Int start, Int length, 
00123                                 Byte *dst, ImgChannel channel = chMono) const;
00124  
00125     // generic load/save : type is inferred from the extension
00126     Int             Save(FileName &filename);
00127     Int             Load(FileName &filename);
00128     static Void     PrintSupportedFormats(ostream &s);
00129     
00130     // specialised load/save
00131     Int             SavePPM(const Char *filename);
00132     Int             LoadPPM(const Char *filename);     
00133     Int             SaveTIFF(const Char *filename);
00134     Int             LoadTIFF(const Char *filename);
00135     Int             SaveJPEG(const Char *filename);
00136     Int             LoadJPEG(const Char *filename);
00137     Int             SaveGIF(const Char *filename);
00138     Int             LoadGIF(const Char *filename);
00139 
00140     ImgTag          Tag() const { return(tag); };
00141     
00142     static Int      sJPEGQuality;   // 0..100, default = 90
00143 
00144 protected:
00145     Int             width;
00146     Int             height;
00147     ImgTag          tag;
00148 };
00149 
00150 
00151 // --- Specific image classes -------------------------------------------------
00152 
00153 class RGBAImage : public Image
00154 {
00155 public:
00156     RGBAImage() : Image(imgRGBATag), data(0) {};
00157     
00158     Void    SetSize(Int width, Int height);
00159 
00160     Void    Clear(const Colour &c);
00161     Void    SetPixel(Int x, Int y, const Colour &c);
00162     Colour  GetPixel(Int x, Int y) const;
00163     Void    SetSpan(Int row, Int start, Int length, const Colour *src);
00164     Void    GetSpan(Int row, Int start, Int length, Colour *dst) const;
00165     Void    SetRGBASpan(Int row, Int start, Int length, const RGBAPixel *src);
00166     Void    GetRGBASpan(Int row, Int start, Int length, RGBAPixel *dst) const;
00167 
00168     RGBAPixel
00169             *RGBAData() const {return(data);};
00170 
00171 protected:
00172     RGBAPixel   *data;
00173 };
00174 
00175 class ByteImage : public Image
00176 {
00177 public:
00178     ByteImage() : Image(imgByteTag), data(0) {};
00179     
00180     Void    SetSize(Int width, Int height);
00181 
00182     Void    Clear(const Colour &c);
00183     Void    SetPixel(Int x, Int y, const Colour &c);
00184     Colour  GetPixel(Int x, Int y) const;
00185     Void    SetRealPixel(Int x, Int y, ClrReal r, ImgChannel channel = chMono);
00186     ClrReal GetRealPixel(Int x, Int y, ImgChannel channel = chMono) const;
00187 
00188     Void    SetSpan(Int row, Int start, Int length, const Colour *src);
00189     Void    GetSpan(Int row, Int start, Int length, Colour *dst) const;
00190     Void    SetByteSpan(Int row, Int start, Int length,
00191                     const Byte *src, ImgChannel channel = chMono);
00192     Void    GetByteSpan(Int row, Int start, Int length, 
00193                     Byte *dst, ImgChannel channel = chMono) const;
00194 
00195     Byte    *ByteData() const {return(data);};
00196 
00197 protected:
00198     Byte    *data;
00199 };
00200 
00201 class RGBEImage : public Image
00202 {
00203 public:
00204     RGBEImage() : Image(imgRGBETag), data(0) {};
00205     
00206     Void    SetSize(Int width, Int height);
00207 
00208     Void    Clear(const Colour &c);
00209     Void    SetPixel(Int x, Int y, const Colour &c);
00210     Colour  GetPixel(Int x, Int y) const;
00211     Void    SetSpan(Int row, Int start, Int length, const Colour *src);
00212     Void    GetSpan(Int row, Int start, Int length, Colour *dst) const;
00213 
00214     Int     SavePIC(const Char *filename);
00215     Int     LoadPIC(const Char *filename);
00216 
00217     RGBEPixel
00218             *RGBEData() const {return(data);};
00219 
00220 protected:
00221     RGBEPixel   *data;
00222 };
00223 
00224 Colour      RGBEToColour(RGBEPixel rgbe);
00225 RGBEPixel   ColourToRGBE(const Colour &c);
00226 
00227 
00228 // --- Channel-based image ----------------------------------------------------
00229 
00230 #ifdef UNFINISHED
00231 class ChannelImage : public Image
00232 {
00233 public:
00234     ChannelImage();
00235 
00236     SetImageType();
00237     SetImageLayer();
00238 
00239 protected:
00240     Void            *chData[chMax];
00241     ImgStoreType    chType[chMax];
00242 }
00243 #endif
00244 
00245 
00246 // --- Conversion routines ----------------------------------------------------
00247 
00248 inline Colour RGBAToColour(RGBAPixel rgba)
00249 {
00250     Colour result;
00251     result[0] = rgba.ch[rgba_R] / 255.0;
00252     result[1] = rgba.ch[rgba_G] / 255.0;
00253     result[2] = rgba.ch[rgba_B] / 255.0;
00254     return(result); 
00255 }
00256 
00257 inline RGBAPixel ColourToRGBA(const Colour &c)
00258 {
00259     RGBAPixel result;
00260     result.ch[rgba_R] = (Byte) (c[0] * 255.0);
00261     result.ch[rgba_G] = (Byte) (c[1] * 255.0);
00262     result.ch[rgba_B] = (Byte) (c[2] * 255.0);
00263     return(result); 
00264 }
00265 
00266 inline Colour ByteToColour(Byte b)
00267 {
00268     Colour  result;
00269     ClrReal temp = b / 255.0;
00270 
00271     result[0] = temp;
00272     result[1] = temp;
00273     result[2] = temp;
00274     return(result); 
00275 }
00276 
00277 inline Byte ColourToByte(const Colour &c)
00278 {
00279     ClrReal temp;
00280 
00281     temp = c[0] + c[1] + c[2];
00282     return((Byte) (temp * (255.0 / 3.0)));
00283 }
00284 
00285 #endif

Generated at Sat Aug 5 00:17:00 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000