Browse Source

Finalisation de ouvrir() et sauver()

Les fonctions marchent mais ne sont pas inclues dans les commandes disponibles, on fera ça avec tout le reste.
* traitementImage.cpp
	* La fonction créer est désormais complète
	* La fonction sauver est désormais complète
* utilitaires.cpp
	* Ajout d'une fonction caraVersEntier() pour convertir manuellement un octet vers un int. Nécessaire car la conversion par type était assez difficile à maitriser
* test.cpp
	* Ajout d'une fonction appliquer afin de faire des tests en série
* image.h
	* Les unsigned int sont désormais remis en int
Cela a permis d'éviter quelques bugs lors de l'ouverture et de la fermeture de fichiers. Ils pourraient potentiellement être remis, mais ils ne servent pas à grand chose au final à par compliquer la tâche.
* Rajout de utilitaires.cpp aux dépendances du Makefile
tags/v1.0.0
parent
commit
077ef18a41
7 changed files with 220 additions and 67 deletions
  1. 2
    2
      Makefile
  2. 2
    2
      Makefile.win
  3. 7
    7
      src/image.cpp
  4. 15
    15
      src/image.h
  5. 21
    12
      src/testing.cpp
  6. 159
    28
      src/traitementImage.cpp
  7. 14
    1
      src/utilitaires.cpp

+ 2
- 2
Makefile View File

@@ -23,10 +23,10 @@ $(EXEPATH)testing: $(OBJPATH)testing.o $(OBJPATH)image.o
23 23
 
24 24
 # Dépendances
25 25
 ## Fichiers executables
26
-$(OBJPATH)main.o: $(SRCPATH)main.cpp $(SRCPATH)affichageFenetre.cpp $(SRCPATH)image.cpp $(SRCPATH)traitementImage.cpp $(SRCPATH)analyserCommande.cpp
26
+$(OBJPATH)main.o: $(SRCPATH)main.cpp $(SRCPATH)affichageFenetre.cpp $(SRCPATH)image.cpp $(SRCPATH)utilitaires.cpp $(SRCPATH)traitementImage.cpp $(SRCPATH)analyserCommande.cpp
27 27
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
28 28
 
29
-$(OBJPATH)testing.o: $(SRCPATH)testing.cpp $(SRCPATH)affichageFenetre.cpp $(SRCPATH)image.cpp $(SRCPATH)traitementImage.cpp $(SRCPATH)analyserCommande.cpp
29
+$(OBJPATH)testing.o: $(SRCPATH)testing.cpp $(SRCPATH)affichageFenetre.cpp $(SRCPATH)image.cpp $(SRCPATH)utilitaires.cpp $(SRCPATH)traitementImage.cpp $(SRCPATH)analyserCommande.cpp
30 30
 	$(CXX) -c $< -o $@ $(CXXFLAGSDEBUG)
31 31
 ## Bibliothèques
32 32
 $(OBJPATH)image.o: $(SRCPATH)image.cpp

+ 2
- 2
Makefile.win View File

@@ -23,10 +23,10 @@ $(EXEPATH)testing: $(OBJPATH)testing.o $(OBJPATH)image.o
23 23
 
24 24
 # Dépendances
25 25
 ## Fichiers executables
26
-$(OBJPATH)main.o: $(SRCPATH)main.cpp $(SRCPATH)affichageFenetre.cpp $(SRCPATH)image.cpp $(SRCPATH)traitementImage.cpp $(SRCPATH)analyserCommande.cpp
26
+$(OBJPATH)main.o: $(SRCPATH)main.cpp $(SRCPATH)affichageFenetre.cpp $(SRCPATH)image.cpp $(SRCPATH)utilitaires.cpp $(SRCPATH)traitementImage.cpp $(SRCPATH)analyserCommande.cpp
27 27
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
28 28
 
29
-$(OBJPATH)testing.o: $(SRCPATH)testing.cpp $(SRCPATH)affichageFenetre.cpp $(SRCPATH)image.cpp $(SRCPATH)traitementImage.cpp $(SRCPATH)analyserCommande.cpp
29
+$(OBJPATH)testing.o: $(SRCPATH)testing.cpp $(SRCPATH)affichageFenetre.cpp $(SRCPATH)image.cpp $(SRCPATH)utilitaires.cpp $(SRCPATH)traitementImage.cpp $(SRCPATH)analyserCommande.cpp
30 30
 	$(CXX) -c $< -o $@ $(CXXFLAGSDEBUG)
31 31
 ## Bibliothèques
32 32
 $(OBJPATH)image.o: $(SRCPATH)image.cpp

+ 7
- 7
src/image.cpp View File

@@ -1,6 +1,6 @@
1 1
 #include "image.h"
2 2
 
3
-Image::Image(unsigned int dimensionX, unsigned int dimensionY, unsigned int maxComposante, PILG_Comp typeComposantes): m_dimensionX(dimensionX), m_dimensionY(dimensionY), m_maxComposante(maxComposante), m_typeComposantes(typeComposantes) {
3
+Image::Image(int dimensionX, int dimensionY, int maxComposante, PILG_Comp typeComposantes): m_dimensionX(dimensionX), m_dimensionY(dimensionY), m_maxComposante(maxComposante), m_typeComposantes(typeComposantes) {
4 4
     Pixel pixelVide = g_pixelVide();
5 5
     for (int xT = 0; xT < dimensionX; xT++) {
6 6
         std::vector< Pixel > colonne;
@@ -12,11 +12,11 @@ Image::Image(unsigned int dimensionX, unsigned int dimensionY, unsigned int maxC
12 12
 }
13 13
 
14 14
 // Getters
15
-unsigned int Image::g_dimensionX() const {
15
+int Image::g_dimensionX() const {
16 16
     return m_dimensionX;
17 17
 }
18 18
 
19
-unsigned int Image::g_dimensionY() const {
19
+int Image::g_dimensionY() const {
20 20
     return m_dimensionY;
21 21
 }
22 22
 
@@ -24,11 +24,11 @@ PILG_Comp Image::g_typeComposantes() const {
24 24
     return m_typeComposantes;
25 25
 }
26 26
 
27
-unsigned int Image::g_maxComposante() const {
27
+int Image::g_maxComposante() const {
28 28
     return m_maxComposante;
29 29
 }
30 30
 
31
-int Image::g_pixel(unsigned int x, unsigned int y, Pixel &pixel) const {
31
+int Image::g_pixel(int x, int y, Pixel &pixel) const {
32 32
     if (v_dimensions(x, y)) {
33 33
         pixel = m_tab[x][y];
34 34
         return 0;
@@ -39,7 +39,7 @@ int Image::g_pixel(unsigned int x, unsigned int y, Pixel &pixel) const {
39 39
 }
40 40
 
41 41
 // Setters
42
-int Image::s_pixel(unsigned int x, unsigned int y, Pixel pixel) {
42
+int Image::s_pixel(int x, int y, Pixel pixel) {
43 43
     if (v_dimensions(x, y) && v_pixel(pixel)) {
44 44
         m_tab[x][y] = pixel;
45 45
         return 0;
@@ -96,6 +96,6 @@ bool Image::v_pixel(Pixel pixel) const {
96 96
     }
97 97
 }
98 98
 
99
-bool Image::v_dimensions(unsigned int x, unsigned int y) const {
99
+bool Image::v_dimensions(int x, int y) const {
100 100
     return (x >= 0 && x < m_dimensionX && y >= 0 && y < m_dimensionY);
101 101
 }

+ 15
- 15
src/image.h View File

@@ -4,37 +4,37 @@ typedef enum {PILG_BIN, PILG_NIV, PILG_RVB} PILG_Comp;
4 4
 
5 5
 typedef struct Pixel {
6 6
     PILG_Comp typeComposantes;
7
-    unsigned int maxComposante;
8
-    unsigned int r;
9
-    unsigned int v;
10
-    unsigned int b;
11
-    unsigned int g;
7
+    int maxComposante;
8
+    int r;
9
+    int v;
10
+    int b;
11
+    int g;
12 12
     bool n;
13 13
 } Pixel;
14 14
 
15 15
 class Image {
16 16
 public:
17
-    Image(unsigned int dimensionX, unsigned int dimensionY, unsigned int maxComposante, PILG_Comp typeComposantes);
17
+    Image(int dimensionX, int dimensionY, int maxComposante, PILG_Comp typeComposantes);
18 18
     // Getters
19
-    unsigned int g_dimensionX() const;
20
-    unsigned int g_dimensionY() const;
19
+    int g_dimensionX() const;
20
+    int g_dimensionY() const;
21 21
     PILG_Comp g_typeComposantes() const;
22
-    unsigned int g_maxComposante() const;
23
-    int g_pixel(unsigned int x, unsigned int y, Pixel &pixel) const;
22
+    int g_maxComposante() const;
23
+    int g_pixel(int x, int y, Pixel &pixel) const;
24 24
     // Setters
25
-    int s_pixel(unsigned int x, unsigned int y, Pixel pixel);
25
+    int s_pixel(int x, int y, Pixel pixel);
26 26
     // Utilitaires
27 27
     Pixel g_pixelVide() const;
28 28
     Image g_vide() const;
29 29
     // Validateurs
30 30
     bool v_pixel(Pixel pixel) const;
31
-    bool v_dimensions(unsigned int x, unsigned int y) const;
31
+    bool v_dimensions(int x, int y) const;
32 32
 
33 33
 private:
34 34
     // Variables
35
-    unsigned int m_dimensionX;
36
-    unsigned int m_dimensionY;
35
+    int m_dimensionX;
36
+    int m_dimensionY;
37 37
     PILG_Comp m_typeComposantes;
38
-    unsigned int m_maxComposante;  // Maximum de composante (sauf binaire)
38
+    int m_maxComposante;  // Maximum de composante (sauf binaire)
39 39
     std::vector< std::vector< Pixel > > m_tab;
40 40
 };

+ 21
- 12
src/testing.cpp View File

@@ -99,6 +99,13 @@ Image genererBruit(int dimX, int dimY) {
99 99
     return image;
100 100
 }
101 101
 
102
+int appliquer(Image &image, string nomFichier, string ID, bool ASCII) {
103
+    ouvrir(image, "tests/" + nomFichier);
104
+    sauver(image, "tests/" + ID, ASCII, nomFichier);
105
+    afficherImage(image);
106
+    attendreFenetre();
107
+}
108
+
102 109
 int main(int argc, char *args[]) {
103 110
 #if defined(WIN32) // Permet de refaire fonctionner cout et cerr sous Windows après démarrage de SDL
104 111
     freopen("CON", "w", stdout);
@@ -107,27 +114,29 @@ int main(int argc, char *args[]) {
107 114
 
108 115
     presentation();
109 116
 
110
-    #define DIMENSIONS 256
111
-    Image imageOriginale = genererRoue(DIMENSIONS*2, DIMENSIONS, 255);
112
-    // Image imageoriginale; // Tester si ça marche
117
+    #define DIMENSIONS 50
118
+    Image image1 = genererRoue(DIMENSIONS*2, DIMENSIONS, 255);
119
+    Image image2 = genererRoue(DIMENSIONS*2, DIMENSIONS, 255);
120
+    // Image image1; // Tester si ça marche
121
+    // afficherImage(image1);
122
+    // attendreFenetre();
113 123
 
114 124
     // // Roue
115
-    // Image image = imageOriginale.g_vide();
125
+    // Image image = image1.g_vide();
116 126
     // for (float i = 0; i < 2 * PI; i += 0.1) {
117
-    //     pivoter(imageOriginale, image, DIMENSIONS/2, DIMENSIONS/2, i);
127
+    //     pivoter(image1, image, DIMENSIONS/2, DIMENSIONS/2, i);
118 128
     //     afficherImage(image);
119 129
     // }
120 130
 
121 131
     // Ouvrir fichier
122
-    // cout << ouvrir(imageOriginale, "tests/PikachuP6.ppm") << endl;
132
+    appliquer(image1, "PikachuP1.pbm", "1", true);
133
+    appliquer(image1, "PikachuP2.pgm", "2", true);
134
+    appliquer(image1, "PikachuP3.ppm", "3", true);
135
+    appliquer(image1, "PikachuP4.pbm", "4", false);
136
+    appliquer(image1, "PikachuP5.pgm", "5", false);
137
+    appliquer(image1, "PikachuP6.ppm", "6", false);
123 138
     
124
-    afficherImage(imageOriginale);
125
-    attendreFenetre();
126
-
127
-    // pivoter(imageOriginale, imageOriginale, imageOriginale.g_dimensionX()/2, imageOriginale.g_dimensionY()/2, 0.5);
128
-    // attendreFenetre();
129 139
 
130
-    cout << sauver(imageOriginale, "tests/Sauvegardé.ppm", true, "Ceci est un commentaire") << endl;
131 140
 
132 141
     // // Neige en dégradé
133 142
     // for (int i; i < 300; i++) {

+ 159
- 28
src/traitementImage.cpp View File

@@ -1,19 +1,22 @@
1
-#include <math.h>
2 1
 #include <fstream>
3 2
 
4 3
 #define PI 3.14159265359
5 4
 #define MAXCOMPOSANTEDEFAUT 255
5
+#define FICHIER_SEPARATEUR (char) 0x0a
6 6
 
7 7
 typedef enum {PILG_TYPE, PILG_DIMENSIONS, PILG_MAXCOMPOSANTE, PILG_IMAGE} PILG_OuvrirEtape;
8 8
 
9 9
 // Gestion de fichiers
10
-int creer(Image &sortie, unsigned int dimensionX, unsigned int dimensionY, unsigned int maxComposante, PILG_Comp typeComposantes) { // Créer une image de dimensions X et Y
10
+int creer(Image &sortie, int dimensionX, int dimensionY, int maxComposante, PILG_Comp typeComposantes) { // Créer une image de dimensions X et Y
11 11
     sortie = *new Image(dimensionX, dimensionY, maxComposante, typeComposantes);
12 12
     return 0;
13 13
 }
14 14
 
15 15
 int ouvrir(Image &sortie, string nomFichier) { // Ouvrir une image existante à partir du nom du fichier ***Geoffrey
16 16
     // Ouverture du fichier
17
+#if DEBUG
18
+    cout << "→ " << nomFichier << endl;
19
+#endif
17 20
     ifstream streamFichier(nomFichier.c_str(), ios::in);
18 21
     if (streamFichier) {
19 22
         // Calcul de la taille (en octets) du fichier
@@ -22,13 +25,12 @@ int ouvrir(Image &sortie, string nomFichier) { // Ouvrir une image existante à
22 25
 
23 26
         // Stockage du fichier dans une chaîne
24 27
         streamFichier.seekg(0, ios::beg);
25
-        char *caracteres = new char [tailleFichier];
26
-        streamFichier.read(caracteres, tailleFichier);
27
-        string fichier_caracteres(caracteres);
28
-        delete[] caracteres;
28
+        char *fichier_caracteres = new char [tailleFichier];
29
+        streamFichier.read(fichier_caracteres, tailleFichier);
29 30
         streamFichier.close();
30 31
 
31 32
         // Variables d'informations
33
+        char cara;
32 34
         PILG_OuvrirEtape ouvrirEtape(PILG_TYPE);
33 35
         bool ASCII(false);
34 36
         int dimensionX;
@@ -40,12 +42,15 @@ int ouvrir(Image &sortie, string nomFichier) { // Ouvrir une image existante à
40 42
         string element("");
41 43
         int x(0);
42 44
         int y(0);
43
-        string pixelASCII;
44
-        int RVBcomposante(0); // Composante actuelle pour RVB
45
+        int i(0);
46
+        Pixel pixel;
47
+        string tmpASCII;
48
+        char RVBcomposante(0); // Composante actuelle pour RVB
45 49
 
46 50
         for (int c(0); c < tailleFichier; c++) {
51
+            cara = fichier_caracteres[c];
47 52
             if (ouvrirEtape != PILG_IMAGE) {
48
-                if (fichier_caracteres[c] ==  (char) 0x0a) { // En cas de nouvel élément
53
+                if (cara == FICHIER_SEPARATEUR) { // En cas de nouvel élément
49 54
                     if (element[0] != '#') { // Si c'est un commentaire, on passe à l'élément suivant
50 55
                         switch (ouvrirEtape) {
51 56
                         case PILG_TYPE:
@@ -100,9 +105,9 @@ int ouvrir(Image &sortie, string nomFichier) { // Ouvrir une image existante à
100 105
                                 if (element[j] == ' ') {
101 106
                                     espaceDepasse = true;
102 107
                                 } else if (espaceDepasse) {
103
-                                    dimensionXchaine += element[j];
104
-                                } else {
105 108
                                     dimensionYchaine += element[j];
109
+                                } else {
110
+                                    dimensionXchaine += element[j];
106 111
                                 }
107 112
                             }
108 113
                             chaineVersEntier(dimensionXchaine, dimensionX);
@@ -132,23 +137,100 @@ int ouvrir(Image &sortie, string nomFichier) { // Ouvrir une image existante à
132 137
                             return 4;
133 138
                             break;
134 139
                         }
135
-                        element = "";
136 140
                         if (ouvrirEtape == PILG_IMAGE) {
137 141
                             sortie = *new Image(dimensionX, dimensionY, maxComposante, typeComposantes);
142
+                            pixel = sortie.g_pixelVide();
138 143
                         }
139 144
                     }
145
+                    element = "";
140 146
                 } else {
141
-                    element += fichier_caracteres[c];
147
+                    element += cara;
142 148
                 }
143 149
             } else {
144
-                // ...
150
+                if (ASCII) {
151
+                    if (typeComposantes == PILG_BIN) {
152
+                        if (cara != FICHIER_SEPARATEUR) {
153
+                            pixel.n = (cara == 0x31) ? false : true;
154
+                            sortie.s_pixel(x, y, pixel);
155
+                            x++;
156
+                        }
157
+                    } else {
158
+                        if (cara == FICHIER_SEPARATEUR) {
159
+                            if (typeComposantes == PILG_RVB) {
160
+                                switch (RVBcomposante) {
161
+                                case 0:
162
+                                    chaineVersEntier(tmpASCII, pixel.r);
163
+                                    RVBcomposante = 1;
164
+                                    break;
165
+                                case 1:
166
+                                    chaineVersEntier(tmpASCII, pixel.v);
167
+                                    RVBcomposante = 2;
168
+                                    break;
169
+                                case 2:
170
+                                    chaineVersEntier(tmpASCII, pixel.b);
171
+                                    RVBcomposante = 0;
172
+                                    sortie.s_pixel(x, y, pixel);
173
+                                    x++;
174
+                                    break;
175
+                                }
176
+                            } else {
177
+                                chaineVersEntier(tmpASCII, pixel.g);
178
+                                sortie.s_pixel(x, y, pixel);
179
+                                x++;
180
+                            }
181
+                            tmpASCII = "";
182
+                        } else {
183
+                            tmpASCII += cara;
184
+                        }
185
+
186
+                    }
187
+                } else {
188
+                    if (typeComposantes == PILG_BIN) {
189
+                        for (i = 7; i >= 0; i--) {
190
+                            pixel.n = !((cara >> i) & 0x01);
191
+                            sortie.s_pixel(x, y, pixel);
192
+                            x++;
193
+                            if (x >= dimensionX) {
194
+                                y++;
195
+                                x = 0;
196
+                            }
197
+                        }
198
+                    } else {
199
+                        if (typeComposantes == PILG_RVB) {
200
+                            switch (RVBcomposante) {
201
+                            case 0:
202
+                                pixel.r = caraVersEntier(cara);
203
+                                RVBcomposante = 1;
204
+                                break;
205
+                            case 1:
206
+                                pixel.v = caraVersEntier(cara);
207
+                                RVBcomposante = 2;
208
+                                break;
209
+                            case 2:
210
+                                pixel.b = caraVersEntier(cara);
211
+                                RVBcomposante = 0;
212
+                                sortie.s_pixel(x, y, pixel);
213
+                                x++;
214
+                                break;
215
+                            }
216
+                        } else {
217
+                            pixel.g = caraVersEntier(cara);
218
+                            sortie.s_pixel(x, y, pixel);
219
+                            x++;
220
+                        }
221
+                    }
222
+                }
223
+                if (x >= dimensionX) {
224
+                    y++;
225
+                    x += -dimensionX;
226
+                }
145 227
             }
146 228
         }
147 229
     } else {
148 230
         return 1;
149 231
     }
150 232
 #if DEBUG
151
-    cout << endl << endl;
233
+    cout << endl;
152 234
 #endif
153 235
 
154 236
     return 0;
@@ -156,26 +238,75 @@ int ouvrir(Image &sortie, string nomFichier) { // Ouvrir une image existante à
156 238
 
157 239
 int sauver(Image entree, string nomFichier, bool ASCII, string commentaire) { // Sauvegarder l'image obtenue dans un nouveau fichier
158 240
     ofstream fichier(nomFichier.c_str(), ios::out | ios::trunc);
159
-#define FICHIER_SEPARATEUR (char) 0x0a
160
-    if (entree.g_typeComposantes() == PILG_RVB && ASCII) {
161
-        fichier << "P6";
162
-    } else {
241
+    char numero;
242
+    switch (entree.g_typeComposantes()) {
243
+    case PILG_BIN:
244
+        numero = ASCII ? '1' : '4';
245
+        break;
246
+    case PILG_NIV:
247
+        numero = ASCII ? '2' : '5';
248
+        break;
249
+    case PILG_RVB:
250
+        numero = ASCII ? '3' : '6';
251
+        break;
252
+    default:
163 253
         return 1;
164 254
     }
165
-    fichier << FICHIER_SEPARATEUR;
166
-    // if (commentaire) {
167
-    //     fichier << "#" << commentaire << FICHIER_SEPARATEUR;
168
-    // }
255
+
256
+    fichier << "P" << numero << FICHIER_SEPARATEUR;
257
+    if (commentaire != "") {
258
+        fichier << "# " << commentaire << FICHIER_SEPARATEUR;
259
+    }
169 260
     fichier << entree.g_dimensionX() << " " << entree.g_dimensionY() << FICHIER_SEPARATEUR;
170
-    
261
+
171 262
     if (entree.g_typeComposantes() != PILG_BIN) {
172 263
         fichier << entree.g_maxComposante() << FICHIER_SEPARATEUR;;
173 264
     }
174 265
     Pixel pixel;
175
-    for (int x = 0; x <= entree.g_dimensionX(); x++) {
176
-        for (int y = 0; y <= entree.g_dimensionY(); y++) {
177
-            if (entree.g_typeComposantes() == PILG_RVB && ASCII) {
178
-                fichier << pixel.r << FICHIER_SEPARATEUR << pixel.v << FICHIER_SEPARATEUR << pixel.b << FICHIER_SEPARATEUR;
266
+    char brutBINpixel;
267
+    int brutBINpixelRang = 7;
268
+    for (int y = 0; y < entree.g_dimensionY(); y++) {
269
+        for (int x = 0; x < entree.g_dimensionX(); x++) {
270
+            entree.g_pixel(x, y, pixel);
271
+            switch (entree.g_typeComposantes()) {
272
+            case PILG_BIN:
273
+                if (ASCII) {
274
+                    if (pixel.n) {
275
+                        fichier << '0';
276
+                    } else {
277
+                        fichier << '1';
278
+                    }
279
+                } else {
280
+                    if (pixel.n) {
281
+                        brutBINpixel &= ~(1 << brutBINpixelRang);
282
+                    } else {
283
+                        brutBINpixel |= 1 << brutBINpixelRang;
284
+                    }
285
+                    brutBINpixelRang--;
286
+                    if (brutBINpixelRang < 0) {
287
+                        fichier << brutBINpixel;
288
+                        brutBINpixelRang = 7;
289
+                    }
290
+                }
291
+                break;
292
+            case PILG_NIV:
293
+                if (ASCII) {
294
+                    fichier << pixel.g << FICHIER_SEPARATEUR;
295
+                } else {
296
+                    fichier << (char) pixel.g;
297
+                }
298
+                break;
299
+            case PILG_RVB:
300
+                if (ASCII) {
301
+                    fichier << pixel.r << FICHIER_SEPARATEUR << pixel.v << FICHIER_SEPARATEUR << pixel.b << FICHIER_SEPARATEUR;
302
+                } else {
303
+                    fichier << (char) pixel.r
304
+                            << (char) pixel.v
305
+                            << (char) pixel.b;
306
+                }
307
+                break;
308
+            default:
309
+                return 1;
179 310
             }
180 311
         }
181 312
     }

+ 14
- 1
src/utilitaires.cpp View File

@@ -1,3 +1,5 @@
1
+#include <math.h>
2
+
1 3
 #define NOMBREOR 1.61803398875
2 4
 
3 5
 void presentation() {
@@ -5,7 +7,8 @@ void presentation() {
5 7
          << "|  _ \\|_ _|| |    / ___|" << endl
6 8
          << "| |_) || | | |   | |  _ "  << endl
7 9
          << "|  __/ | | | |___| |_| |"  << endl
8
-         << "|_|   |___||_____|\\____|" << endl;
10
+         << "|_|   |___||_____|\\____|" << endl
11
+         << endl;
9 12
 }
10 13
 
11 14
 Image imageDefaut() {
@@ -80,3 +83,13 @@ int chaineVersFlottant(string chaine, float &flottant) {
80 83
     }
81 84
     return 0;
82 85
 }
86
+
87
+int caraVersEntier(char cara) {
88
+    // int entier = (int) (0 << 8) + cara;
89
+    // entier = entier > 0 ? entier : 256+entier;
90
+    int i, entier = 0;
91
+    for (i = 0; i < 8; i++) {
92
+        entier += ((cara >> i) & 0x01) ? pow(2, i) : 0;
93
+    }
94
+    return entier;
95
+}