#ifndef INCLUDE_IMAGE_H #define INCLUDE_IMAGE_H #include #define max(a, b) (((a)>(b))?(a):(b)) #define min(a, b) (((a)<(b))?(a):(b)) const double PI = 3.1415926535; typedef int ImageDatum; #define dataToDouble(a) (double(a)/255.0) #define doubleToData(b) (ImageDatum(b*255.0)) union Pixel { struct RGB_Pixel { ImageDatum r; ImageDatum g; ImageDatum b; } rgb; struct HSI_Pixel { ImageDatum h; ImageDatum s; ImageDatum i; } hsi; }; enum ImageMode { Mode_RGB, Mode_HSI }; enum ImageChannel { ch_Red, ch_Blue, ch_Green, ch_Hue, ch_Saturation, ch_Intensity }; class ImageDisplayer; class Image { public: Image(int, int); Image(char*); Image(Image&); ~Image(); bool load(char*); bool save(char*); void display(char*); void annotate(char*, char*); ImageDatum getValue(ImageChannel, int, int); void setValue(ImageChannel, int, int, ImageDatum); bool isBlack(int, int); bool isWhite(int, int); ImageDatum getGrey(int, int); void settoBlack(int, int); void settoWhite(int, int); void setGrey(int, int, ImageDatum); int height(); int width(); void RGBtoHSI(); void swap(Image* that); // for internal use - not for the faint of heart void write_to_fp(FILE*); void read_from_fp(FILE*); static bool showGUI; static long memReq; protected: void init(int, int); int h, w; ImageMode mode; Pixel* p; Pixel* getPixel(int, int); void openGUI(); void loadRGB(char*,int,int); void saveRGB(char*); static FILE* guiRead; static FILE* guiWrite; }; #endif