diff --git a/main.c b/main.c index e963e5b0a4777997ceeb55bc4b01f1c69779ffc5..ae97041d99ca8623600d85f7a31748f6384d7f80 100644 --- a/main.c +++ b/main.c @@ -1,10 +1,11 @@ #include "gfx.h" #include "pgm.h" -pgm_error renderPgm(struct gfx_context_t *context, const pgm *const orig) { +pgm_error renderPgm(struct gfx_context_t *context, const pgm *const orig) +{ //Modification de la fonction dans l'exemple d'utilisation de la lib pour intégrer pgm - + uint32_t intensity; uint32_t color; gfx_clear(context, COLOR_BLACK); @@ -14,7 +15,7 @@ pgm_error renderPgm(struct gfx_context_t *context, const pgm *const orig) { for (int j = 0; j < orig->pixels.n; j++) { intensity = orig->pixels.data[i][j]; - color = MAKE_COLOR(intensity,intensity,intensity); + color = MAKE_COLOR(intensity, intensity, intensity); gfx_putpixel(context, j, i, color); } } @@ -22,76 +23,75 @@ pgm_error renderPgm(struct gfx_context_t *context, const pgm *const orig) { return success; } -int main(){ - int boxBlur[] = { 1, 2, 1, 2, 4, 2, 1, 2, 1}; +int main() +{ + int filtre[] = {1, 2, 1, 2, 4, 2, 1, 2, 1}; //Flou de gaus 3 x 3 + int normeFiltre = 16; pgm p; pgm_read_from_file(&p, "./img/mandrill.pgm"); pgm_write_to_file(&p, "./img/mandrill2.pgm"); - pgm ph; - pgm_photomaton(&ph,&p); + pgm_photomaton(&ph, &p); pgm_write_to_file(&ph, "./img/photomaton_mandrill.pgm"); //SYM VERTICAL pgm symV; pgm_symmetry_vert(&symV, &p); pgm_write_to_file(&symV, "./img/symV_mandrill.pgm"); - //SYM HORIZONTAL pgm symH; pgm_symmetry_hori(&symH, &p); pgm_write_to_file(&symH, "./img/symH_mandrill.pgm"); - //SYM VERTICAL - pgm neg; - pgm_negative(&neg, &p); - pgm_write_to_file(&neg, "./img/neg_mandrill.pgm"); + //NEGATIF + pgm neg; + pgm_negative(&neg, &p); + pgm_write_to_file(&neg, "./img/neg_mandrill.pgm"); - //SYM VERTICAL - pgm symC; - pgm_symmetry_cent(&symC, &p); - pgm_write_to_file(&symC, "./img/symC_mandrill.pgm"); + //SYM CENTRAL + pgm symC; + pgm_symmetry_cent(&symC, &p); + pgm_write_to_file(&symC, "./img/symC_mandrill.pgm"); + //CONV matrix kernel; - matrix_init_from_array(&kernel, 3, 3, boxBlur); + matrix_init_from_array(&kernel, 3, 3, filtre); matrix_print(kernel); - + pgm conv; - pgm_conv(&conv, &p, &kernel, 16); + pgm_conv(&conv, &p, &kernel, normeFiltre); pgm_write_to_file(&conv, "./img/conv_mandrill.pgm"); - //SYM CROP - pgm crop; - pgm_crop(&crop, &p, 100, 200, 100, 200); - pgm_write_to_file(&crop, "./img/crop_mandrill.pgm"); - - int longueur = p.pixels.m; - int hauteur = p.pixels.n; - struct gfx_context_t *ctxt = gfx_create("image", longueur, hauteur); - if (!ctxt) { - fprintf(stderr, "Graphics initialization failed!\n"); - return EXIT_FAILURE; - } - renderPgm(ctxt, &p); - gfx_present(ctxt); + //SYM CROP + pgm crop; + pgm_crop(&crop, &p, 100, 200, 100, 200); + pgm_write_to_file(&crop, "./img/crop_mandrill.pgm"); - while (gfx_keypressed() != SDLK_ESCAPE) { - - } - gfx_destroy(ctxt); - - - - matrix_destroy(&(kernel)); - matrix_destroy(&(conv.pixels)); - matrix_destroy(&(p.pixels)); - matrix_destroy(&(symH.pixels)); - matrix_destroy(&(symV.pixels)); - matrix_destroy(&(neg.pixels)); - matrix_destroy(&(symC.pixels)); - matrix_destroy(&(crop.pixels)); - matrix_destroy(&(ph.pixels)); + //Crée une fenêtre contextuelle + struct gfx_context_t *ctxt = gfx_create("image", p.pixels.n, p.pixels.m); + + if (!ctxt) + { + fprintf(stderr, "Graphics initialization failed!\n"); + return EXIT_FAILURE; + } + //Crée l'image et l'affiche + renderPgm(ctxt, &crop); + gfx_present(ctxt); + //Stop le programme tant que l'user n'a pas appuyé escape + while (gfx_keypressed() != SDLK_ESCAPE){} + gfx_destroy(ctxt); + + matrix_destroy(&(p.pixels)); + matrix_destroy(&(ph.pixels)); + matrix_destroy(&(symV.pixels)); + matrix_destroy(&(symH.pixels)); + matrix_destroy(&(neg.pixels)); + matrix_destroy(&(symC.pixels)); + matrix_destroy(&(kernel)); + matrix_destroy(&(conv.pixels)); + matrix_destroy(&(crop.pixels)); } \ No newline at end of file diff --git a/pgm.c b/pgm.c index c2c9eca873bf1858d9ace7c158c08042a9462205..1aaa211630c0fd448a41859e25a457f73f12f106 100644 --- a/pgm.c +++ b/pgm.c @@ -214,10 +214,19 @@ pgm_error pgm_symmetry_cent(pgm *sym, const pgm *const orig){ return success; } -pgm_error pgm_crop(pgm *crop, const pgm *const orig,int32_t x0, int32_t x1,int32_t y0, int32_t y1){ - - +/** + * @brief Coupe une partie de l'image (à la position x0, x1, y0, y1) + * @param sym pgm résultant + * @param orig image originelle + * @param x0 debut de l'image coupée (en x) + * @param x1 fin de l'image coupée (en x) + * @param y0 debut de l'image coupée (en y) + * @param y1 fin de l'image coupée (en y) + * @return success ou failure en cas d'erreur + */ +pgm_error pgm_crop(pgm *crop, const pgm *const orig,int32_t x0, int32_t x1,int32_t y0, int32_t y1){ crop->max = orig->max; + //Extrait une submatrix de orig et l'affecte à crop if(matrix_extract_submatrix(&crop->pixels, orig->pixels, x0, x1, y0, y1) != OK){ return failure; } @@ -225,9 +234,13 @@ pgm_error pgm_crop(pgm *crop, const pgm *const orig,int32_t x0, int32_t x1,int32 return success; } +/** + * @brief Les pixels sont divisés en 4 de manière a quadrupler l'image de départ (en 4x plus petit) + * @param sym pgm résultant + * @param orig image originelle + * @return success ou failure en cas d'erreur + */ pgm_error pgm_photomaton(pgm *photomaton, const pgm *const orig){ - - int cpt = 0; int32_t elem; int32_t valeurs[orig->pixels.m * orig->pixels.n]; @@ -257,6 +270,7 @@ pgm_error pgm_photomaton(pgm *photomaton, const pgm *const orig){ } + //Création du pgm photomaton->max = orig->max; if(matrix_init_from_array(&photomaton->pixels, orig->pixels.m, orig->pixels.n, valeurs) != OK){ return failure; @@ -265,6 +279,14 @@ pgm_error pgm_photomaton(pgm *photomaton, const pgm *const orig){ return success; } +/** + * @brief Applique une matrice de convolution à un pgm (filtre) + * @param sym pgm résultant + * @param orig image originelle + * @param kernel matrice de convolution + * @param norme norme de la matrice de convultion (diviseur) + * @return success ou failure en cas d'erreur + */ pgm_error pgm_conv(pgm *conv, const pgm *const orig,const matrix *const kernel, double norm){ conv->max = orig->max; @@ -308,7 +330,7 @@ pgm_error pgm_conv(pgm *conv, const pgm *const orig,const matrix *const kernel, } moy = moy / norm; - + //Vérifie le dépassement de limites if(moy < 0){ moy = 0; }