#include "Pixel.h" #include "Image.h" #include #include #include #include #include using namespace std; // Constructeur par défaut de la classe: initialise dimx et dimy à 0 // ce constructeur n'alloue pas de pixel Image::Image() { dimx = 0; dimy = 0; tab = NULL; } // Constructeur de la classe: initialise dimx et dimy (après vérification) // puis alloue le tableau de pixel dans le tas (image noire) Image::Image(const unsigned int dimensionX, const unsigned int dimensionY) { dimx = dimensionX; dimy = dimensionY; tab = new Pixel[dimx * dimy]; } //Destructeur de la classe: déallocation de la mémoire du tableau de pixels //et mise à jour des champs dimx et dimy à 0 Image::~Image() { delete [] tab; tab = NULL; dimx = 0; dimy = 0; } // Accesseur : récupère le pixel original de coordonnées (x,y) en vérifiant leur validité // la formule pour passer d'un tab 2D à un tab 1D est tab[y*dimx+x] Pixel& Image::getPix(const unsigned int x, const unsigned int y) const { assert(x < dimx); assert(y < dimy); return tab[y*dimx+x]; } // Mutateur : modifie le pixel de coordonnées (x,y) void Image::setPix (const unsigned int x, const unsigned int y, const Pixel &couleur) { assert(x < dimx); assert(y < dimy); tab[y*dimx+x] = couleur; } // Dessine un rectangle plein de la couleur dans l'image (en utilisant setPix, indices en paramètre compris) void Image::dessinerRectangle(const int Xmin, const int Ymin, const int Xmax, const int Ymax, const Pixel couleur) { assert(Xmin < Xmax); assert(Ymin < Ymax); for(int i = Xmin; i <= Xmax; i++) { for(int j = Ymin; j <= Ymax; j++) { setPix(i,j,couleur); } } } // Efface l'image en la remplissant de la couleur en paramètre // (en appelant dessinerRectangle avec le bon rectangle) void Image::effacer(const Pixel couleur) { dessinerRectangle(0,0,dimx-1,dimy-1,couleur); } // Effectue une série de tests vérifiant que le module fonctionne et // que les données membres de l'objet sont conformes void Image::testRegression() { dimx = 10; dimy = 10; tab = new Pixel[dimx * dimy]; cout << (int)getPix(1,1).getRouge() << endl; // 0 Pixel c(255,0,0); setPix(1,1,c); cout << (int)getPix(1,1).getRouge() << endl; // 255 dessinerRectangle(0,0,2,2,c); cout << (int)getPix(2,2).getRouge() << endl; // 255 effacer(c); cout << (int)getPix(5,5).getRouge() << endl; // 255 afficherConsole(); sauver("./data/save.txt"); ouvrir("./data/save.txt"); } void Image::sauver(const string & filename) const { ofstream fichier (filename.c_str()); assert(fichier.is_open()); fichier << "P3" << endl; fichier << dimx << " " << dimy << endl; fichier << "255" << endl; for(unsigned int y=0; y> mot >> dimx >> dimy >> mot; assert(dimx > 0 && dimy > 0); if (tab != NULL) delete [] tab; tab = new Pixel [dimx * dimy]; for(unsigned int y=0; y> r >> g >> b; getPix(x,y).setRouge(r); getPix(x,y).setVert(g); getPix(x,y).setBleu(b); } } fichier.close(); cout << "Lecture de l'image " << filename << " ... OK\n"; } void Image::afficherConsole() const { cout << dimx << " " << dimy << endl; for(unsigned int y=0; y 1) zoom--; else if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_g) rotate(); else if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_h) rotate(); } SDL_RenderClear(renderer); SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255); SDL_RenderClear(renderer); image = IMG_LoadTexture(renderer, "./data/printed.ppm"); SDL_Rect texr; SDL_QueryTexture(image, NULL, NULL, &w, &h); texr.x = (dimW/2)-(w*zoom/2)+coefX; texr.y = (dimH/2)-(h*zoom/2)+coefY; texr.w = w*zoom; texr.h = h*zoom; SDL_RenderCopy(renderer, image, NULL, &texr); SDL_RenderPresent(renderer); } SDL_DestroyTexture(image); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); }