Page principale | Hiérarchie des classes | Liste des classes | Liste des fichiers | Membres de classe | Membres de fichier

PNG.hpp

Aller à la documentation de ce fichier.
00001 /// \file 00002 /// Définition des classes permettant de manipuler des fichiers au format PNG 00003 #ifndef GUARD_PNG_h 00004 #define GUARD_PNG_h 00005 00006 #include <string> 00007 #include <setjmp.h> 00008 #include <png.h> 00009 #include <stdio.h> 00010 #include <iostream> 00011 #include <stdexcept> 00012 #include <sstream> 00013 00014 #include "Debug.hpp" 00015 #include "Histogram.hpp" 00016 00017 00018 using namespace std; 00019 static Channel channelPNG(&cout); 00020 /////////////////////////////////////////////////////////////////////////////// 00021 /// Mode de fichier du format PNG 00022 /////////////////////////////////////////////////////////////////////////////// 00023 enum EPNG_TYPE{ 00024 /// Pour raison d'implémentation 00025 PNG_EMPTY, 00026 /// Niveau de gris 00027 PNG_GRAY, 00028 /// Couleur RGB 00029 PNG_COLOR, 00030 /// Palette de couleurs : NON SUPPORTE 00031 PNG_PALET_COLOR, 00032 /// Niveau de gris et transparence : NON SUPPORTE 00033 PNG_GRAY_ALPHA, 00034 /// Couleur RGB et transparence : NON SUPPORTE 00035 PNG_COLOR_ALPHA 00036 }; 00037 class PNG_Base; 00038 /////////////////////////////////////////////////////////////////////////////// 00039 /// Interface sur une classe PNG concrète 00040 /// 00041 /// Gère un compteur de références 00042 /// La pluspart des méthodes sont redirigées vers une instance héritées de 00043 /// PNG_Base 00044 /////////////////////////////////////////////////////////////////////////////// 00045 class PNG{ 00046 /// Pointeur sur l'image 00047 PNG_Base* p; 00048 public: 00049 /// Ouvre un fichier PNG en lecture 00050 PNG(string); 00051 /// Crée un fichier PNG 00052 /// \param int largeur en pixel 00053 /// \param int hauteur en pixel 00054 /// \param type type de fichier 00055 /// \param string nom du fichier 00056 PNG(int, int, EPNG_TYPE, string); 00057 /// Constructeur de copie 00058 PNG(const PNG&); 00059 /// Opérateur d'affectation 00060 PNG& operator=(const PNG&); 00061 /// Destructeur 00062 ~PNG(); 00063 /// Retourne le type du fichier 00064 EPNG_TYPE getType()const; 00065 /// Retourne une chaîne de caractères détaillées 00066 string toString() const; 00067 /// Retourne la largeur de l'image en pixel 00068 int getWidth()const; 00069 /// Retourne la hauteur de l'image en pixel 00070 int getHeight()const; 00071 /// Retourne la couleur du pixel (i, j) 00072 Color getColor(int, int) const; 00073 /// Fixe la couleur du pixel (i, j) 00074 void setColor(int, int, Color); 00075 /// Fixe le niveau de gris du pixel (i, j) 00076 void setColor(int, int, float); 00077 /// Fixe la couleur du pixel (i, j) 00078 void setColor(int, int, float, float, float); 00079 /// Lit le fichier 00080 void read(); 00081 /// Ecrit le fichier; 00082 void write(); 00083 /// Retourne une référence sur l'histogramme de l'image 00084 /// \param int le nombre classes à construir (KMean) 00085 Histogram* getHistogram()const; 00086 }; 00087 /////////////////////////////////////////////////////////////////////////////// 00088 /// Classe de base abstraite pour les 2 type de PNG : lecture et écriture 00089 /// 00090 /// C'est cette classe qui possède le compteur de référence 00091 /////////////////////////////////////////////////////////////////////////////// 00092 class PNG_Base { 00093 friend class PNG; 00094 /// Compteur de références 00095 int use; 00096 protected: 00097 /// Largeur et hauteur de l'image 00098 int width, height; 00099 /// Mode du format PNG 00100 EPNG_TYPE type; 00101 /// Nom du fichier 00102 string fileName; 00103 /// Descripteur du fichier 00104 FILE* fp; 00105 /// Structure PNG 00106 png_structp png_ptr; 00107 /// Info PNG 00108 png_infop info_ptr; 00109 /// Mode de couleur 00110 png_byte color_type; 00111 /// Profondeur 00112 png_byte bit_depth; 00113 /// Largeur d'une lign 00114 int rowbytes; 00115 /// Données 00116 png_bytep* pData; 00117 /// Histogramme de l'image 00118 // Histogram histo; 00119 /// Constructeur 00120 PNG_Base(); 00121 /// Desctructeur 00122 ~PNG_Base(){}; 00123 /// Retourne une chaîne de caractères détaillées 00124 string toString()const; 00125 /// Retourne la largeur de l'image 00126 int getWidth()const; 00127 /// Retourne la hauteur de l'image 00128 int getHeight()const; 00129 /// Retourne le type de l'image 00130 EPNG_TYPE getType()const; 00131 /// Retourne la couleur du pixel (i, j) 00132 virtual Color getColor(int, int) const = 0; 00133 /// Fixe la couleur du pixel (i, j) 00134 virtual void setColor(int, int, Color) = 0; 00135 /// Fixe le niveau de gris du pixel (i, j) 00136 virtual void setColor(int, int, float) = 0; 00137 /// Fixe la couleur du pixel (i, j) 00138 virtual void setColor(int, int, float, float, float) = 0; 00139 /// Lit le fichier 00140 virtual void read() = 0; 00141 /// Ecrit le fichier 00142 virtual void write() = 0; 00143 /// Retourne l'histogramme de l'image 00144 Histogram* getHistogram()const; 00145 00146 }; 00147 /////////////////////////////////////////////////////////////////////////////// 00148 /// Lecture d'une image au format PNG 00149 /////////////////////////////////////////////////////////////////////////////// 00150 class PNG_Reader : public PNG_Base{ 00151 friend class PNG; 00152 /// Constructeur 00153 /// \param string le nom du fichier 00154 PNG_Reader(string _fileName){fileName = _fileName;} 00155 /// Retourne la couleur du pixel (i, j) 00156 Color getColor(int, int) const; 00157 /// Fixe la couleur du pixel (i, j) 00158 void setColor(int, int, Color){} 00159 /// Fixe le niveau de gris du pixel (i, j) 00160 void setColor(int, int, float){} 00161 /// Fixe la couleur du pixel (i, j) 00162 void setColor(int, int, float, float, float){} 00163 /// Lit le fichier 00164 void read(); 00165 void write(){} 00166 }; 00167 /////////////////////////////////////////////////////////////////////////////// 00168 /// Création d'un fichier au format PNG 00169 /////////////////////////////////////////////////////////////////////////////// 00170 class PNG_Writer : public PNG_Base{ 00171 friend class PNG; 00172 /// Buffer de couleurs 00173 vector<Color> buffer; 00174 /// Allocation de mémoire 00175 png_bytep* make_pixels(); 00176 /// Fixe le niveau de gris du pixel (i, j) 00177 void _setColor(int, int, float); 00178 /// Fixe la couleur du pixel (i, j) 00179 void _setColor(int, int, float, float, float); 00180 /// Ecriture du buffer vers l'image 00181 void _setColor(int, int, Color); 00182 /// Crée un fichier PNG 00183 /// \param int largeur en pixel 00184 /// \param int hauteur en pixel 00185 /// \param type type de fichier 00186 /// \param string nom du fichier 00187 PNG_Writer(int, int, EPNG_TYPE, string); 00188 /// Retourne la couleur du buffer en (i, j) 00189 Color getColor(int, int) const; 00190 /// Fixe la couleur du buffer en (i, j) 00191 void setColor(int, int, Color); 00192 /// Fixe le niveau de gris du pixel (i, j) 00193 void setColor(int, int, float); 00194 /// Fixe la couleur du pixel (i, j) 00195 void setColor(int, int, float, float, float); 00196 void read(){} 00197 /// Ecrit le fichier 00198 void write(); 00199 }; 00200 00201 #endif 00202

Généré le Sun Jun 27 15:59:32 2004 pour segment par doxygen 1.3.7