Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.65 KB | None | 0 0
  1. #include "funkcje.h"
  2. #include "opcje.h"
  3.  
  4. #include <assert.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include <unistd.h>
  10.  
  11. int czytaj(FILE *plik_we, Obraz* obraz) {
  12.   char buf[DL_LINII];      /* bufor pomocniczy do czytania naglowka i komentarzy */
  13.   char typObrazu;
  14.   int znak;                /* zmienna pomocnicza do czytania komentarzy */
  15.   int koniec=0;            /* czy napotkano koniec danych w pliku */
  16.   /*Sprawdzenie czy podano prawid�owy uchwyt pliku */
  17.  
  18.   /* assert(plik_we != NULL); */
  19.  
  20.   char* status = fgets(buf, DL_LINII, plik_we);
  21.  
  22.   /* Sprawdzenie "numeru magicznego" - powinien by� P2 */
  23.   if (status==NULL)   /* Wczytanie pierwszej linii pliku do bufora */
  24.     koniec=1;                              /* Nie udalo sie? Koniec danych! */
  25.  
  26.   assert( ((buf[0]!='P') || ((buf[1]!='2') || (buf[1]!='3')) || koniec) && "Blad: To nie jest plik PGM\n");
  27.   typObrazu = buf[1];
  28.  
  29.     if (typObrazu == '2')
  30.     {
  31.         obraz->kolor = 0;
  32.     }
  33.     else
  34.     {
  35.         obraz->kolor = 1;
  36.     }
  37.  
  38.   /* Pominiecie komentarzy */
  39.   do
  40.     {
  41.         znak=fgetc(plik_we);
  42.  
  43.         if (znak=='#')
  44.         {         /*    Czy linia rozpoczyna sie od znaku '#'? */
  45.             if (fgets(buf,DL_LINII,plik_we)==NULL)
  46.             {                                                           /* Przeczytaj ja do bufora                */
  47.                 koniec=1;                   /* Zapamietaj ewentualny koniec danych */
  48.             }
  49.         }
  50.         else
  51.         {
  52.             ungetc(znak,plik_we);                   /* Gdy przeczytany znak z poczatku linii */
  53.         }                                         /* nie jest '#' zwroc go                 */
  54.     } while (znak=='#' && !koniec);   /* Powtarzaj dopoki sa linie komentarza */
  55.                                     /* i nie nastapil koniec danych         */
  56.  
  57.     /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
  58.     if (fscanf(plik_we,"%d %d %d",&(obraz->wymx), &(obraz->wymy),&(obraz->szarosci))!=3)
  59.     {
  60.         fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
  61.         return(0);
  62.     }
  63.  
  64.     /* Zaalokowanie pamieci dla obrazu */
  65.     zaalokuj_pamiec(obraz);
  66.  
  67.     wczytaj(plik_we, obraz);
  68.  
  69.     return obraz->wymx*obraz->wymy;   /* Czytanie zakonczone sukcesem    */
  70. }                       /* Zwroc liczbe wczytanych pikseli */
  71.  
  72. /* Wyswietlenie obrazu o zadanej nazwie za pomoca programu "display"   */
  73. void wyswietl(char *n_pliku) {
  74.   char polecenie[DL_LINII];      /* bufor pomocniczy do zestawienia polecenia */
  75.  
  76.   strcpy(polecenie,"display ");  /* konstrukcja polecenia postaci */
  77.   strcat(polecenie,n_pliku);     /* display "nazwa_pliku" &       */
  78.   strcat(polecenie," &");
  79.   printf("%s\n",polecenie);        /* wydruk kontrolny polecenia */
  80.   system(polecenie);             /* wykonanie polecenia        */
  81. }
  82.  
  83. void wyswietl_aktualny(Obraz* obraz)
  84. {
  85.     FILE* plik;
  86.   char polecenie[DL_LINII];      /* bufor pomocniczy do zestawienia polecenia */
  87.   char ppm_nazwa_tmp[] = "tmp.ppm";
  88.   char pgm_nazwa_tmp[] = "tmp.pgm";
  89.  
  90.   if(obraz->kolor)
  91.   {
  92.     plik=fopen(ppm_nazwa_tmp, "w");
  93.     if(plik==NULL)
  94.         {
  95.             return;
  96.         }
  97.         zapisz(plik,obraz);
  98.     wyswietl(ppm_nazwa_tmp);
  99.     system("clear");              /*Niewyswietlanie na terminalu rm -f tmp.ppm"*/
  100.  
  101.     sleep(1);
  102.  
  103.     strcpy(polecenie,"rm -f ");    /* konstrukcja polecenia postaci */
  104.     strcat(polecenie,ppm_nazwa_tmp);     /* rm -f tmp.pgm       */
  105.     system(polecenie);
  106.   }
  107.   else
  108.   {
  109.     plik=fopen(pgm_nazwa_tmp, "w");
  110.         if(plik==NULL)
  111.         {
  112.             return;
  113.         }
  114.     zapisz(plik, obraz);
  115.     wyswietl(pgm_nazwa_tmp);
  116.     system("clear");              /*Niewyswietlanie na terminalu rm -f tmp.pgm"*/
  117.  
  118.     sleep(1);
  119.  
  120.     strcpy(polecenie,"rm -f ");    /* konstrukcja polecenia postaci */
  121.     strcat(polecenie,pgm_nazwa_tmp);     /* rm -f tmp.pgm       */
  122.     system(polecenie);
  123.   }
  124. }
  125.  
  126. void zapisz(FILE* plik,Obraz* obraz)
  127. {
  128.   /* Funckja zapisz, ktora zapisuje obecny plik obraz_pgm do pliku */
  129.     int i,j; /*zmienne pomocnicze */
  130.  
  131.     if(obraz->kolor)
  132.     {
  133.         fprintf(plik, "P3\n");
  134.         fprintf(plik, "%d %d\n%d\n", obraz->wymx, obraz->wymy, obraz->szarosci);  /* wymiar�w do pliku */
  135.  
  136.         for(i=0; i<obraz->wymy; i++) /* petla ktora zapisuje szary do pliku */
  137.         {
  138.             for(j=0; j<obraz->wymx; j++)
  139.             {
  140.                 fprintf(plik, "%d %d %d ", obraz->r[i][j], obraz->g[i][j], obraz->b[i][j]);
  141.             }
  142.             fprintf(plik, "\n");
  143.         }
  144.  
  145.     }
  146.     else
  147.     {
  148.         fprintf(plik, "P2\n");
  149.         fprintf(plik, "%d %d\n%d\n", obraz->wymx, obraz->wymy, obraz->szarosci);  /* wymiar�w do pliku */
  150.  
  151.         for(i=0; i<obraz->wymy; i++) /* petla ktora zapisuje szary do pliku */
  152.         {
  153.             for(j=0; j<obraz->wymx; j++)
  154.             {
  155.                 fprintf(plik, "%d ", obraz->sz[i][j]);
  156.             }
  157.             fprintf(plik, "\n");
  158.         }
  159.     }
  160.  
  161.     fclose(plik); /* zamkniecie otwartego pliku */
  162. }
  163.  
  164. void wczytaj(FILE* plik_we, Obraz* obraz)           /* funkcja wczytujaca piksele obrazu    */
  165. {
  166.     int i, j;
  167.  
  168.     if(obraz->kolor)
  169.     {
  170.         for (i=0;i<obraz->wymy;i++)
  171.         {
  172.             for (j=0;j<obraz->wymx;j++)
  173.             {
  174.                 if (fscanf(plik_we,"%d %d %d",&(obraz->r[i][j]), &(obraz->g[i][j]), &(obraz->b[i][j])) !=3 )
  175.                 {
  176.                     fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
  177.                     return;
  178.                 }
  179.             }
  180.         }
  181.     }
  182.     else
  183.     {
  184.         for (i=0;i<obraz->wymy;i++)
  185.         {
  186.             for (j=0;j<obraz->wymx;j++)
  187.             {
  188.                 if (fscanf(plik_we,"%d",&(obraz->sz[i][j])) !=1 )
  189.                 {
  190.                     fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
  191.                     return;
  192.                 }
  193.             }
  194.         }
  195.     }
  196. }
  197.  
  198. void zaalokuj_pamiec(Obraz* obraz)
  199. {
  200.     int i;
  201.  
  202.     if(obraz->kolor)
  203.     {
  204.         obraz->sz=malloc(obraz->wymy*sizeof(int*));              /*********************************/
  205.         obraz->r=malloc(obraz->wymy*sizeof(int*));           /*                               */
  206.         obraz->g=malloc(obraz->wymy*sizeof(int*));            /*                               */
  207.         obraz->b=malloc(obraz->wymy*sizeof(int*));          /*                               */
  208.                                                                     /*  zaalokowanie pamieci dla     */
  209.         for(i=0;i<obraz->wymy;i++)                                  /*                               */
  210.         {                                                           /*  obrazow kolorowych           */
  211.             (obraz->sz)[i]=malloc(obraz->wymx*sizeof(int));      /*                               */
  212.             (obraz->r)[i]=malloc(obraz->wymx*sizeof(int));   /*                               */
  213.             (obraz->g)[i]=malloc(obraz->wymx*sizeof(int));    /*                               */
  214.             (obraz->b)[i]=malloc(obraz->wymx*sizeof(int));  /*                               */
  215.         }                                                           /*********************************/
  216.     }
  217.     else
  218.     {
  219.         obraz->sz=malloc(obraz->wymy*sizeof(int*));              /*********************************/
  220.                                                                     /*                               */
  221.         for(i=0;i<obraz->wymy;i++)                                  /*  a tutaj dla szarych          */
  222.         {                                                           /*                               */
  223.             (obraz->sz)[i]=malloc(obraz->wymx*sizeof(int));      /*********************************/
  224.         }
  225.     }
  226. }
  227.  
  228.  
  229. void negatyw(Obraz* obraz)
  230. {
  231.   /* funkcja ktora wykonuje negatyw obrazu */
  232.   int i,j; /* zmienne pomocnicze */
  233.   if(obraz->kolor)
  234.   {
  235.     for(i=0; i<obraz->wymy; i++)
  236.     {
  237.       for(j=0;j<obraz->wymx;j++)
  238.       {
  239.         obraz->r[i][j]=obraz->szarosci-obraz->r[i][j];
  240.         obraz->g[i][j]=obraz->szarosci-obraz->g[i][j];
  241.         obraz->b[i][j]=obraz->szarosci-obraz->b[i][j];
  242.       }
  243.     }
  244.   }
  245.   else
  246.   {
  247.     for(i=0; i<obraz->wymy; i++)
  248.     {
  249.       for(j=0;j<obraz->wymx;j++)
  250.       {
  251.         obraz->sz[i][j]=obraz->szarosci-obraz->sz[i][j]; /* wykonanie negatywu */
  252.       }
  253.     }
  254.   }
  255. }
  256.  
  257. void progowanie(Obraz* obraz, float prog)
  258. {
  259.   /* funkcja wykonujaca progowanie */
  260.   int i,j; /* zmienne pomocnicze */
  261.  
  262.   if(obraz->kolor)
  263.   {
  264.     for(i=0; i<obraz->wymy; i++) /* petla zamieniajaca wartosci pikseli na wartosc po progowaniu */
  265.     {
  266.       for(j=0; j<obraz->wymx; j++)
  267.       {
  268.         if(obraz->r[i][j]<=prog)
  269.         {
  270.           obraz->r[i][j]=0;
  271.         }
  272.         else
  273.         {
  274.           obraz->r[i][j]=obraz->szarosci;
  275.         }
  276.  
  277.         if(obraz->g[i][j]<=prog)
  278.         {
  279.           obraz->g[i][j]=0;
  280.         }
  281.         else
  282.         {
  283.           obraz->g[i][j]=obraz->szarosci;
  284.         }
  285.  
  286.         if(obraz->b[i][j]<=prog)
  287.         {
  288.           obraz->b[i][j]=0;
  289.         }
  290.         else
  291.         {
  292.           obraz->b[i][j]=obraz->szarosci;
  293.         }
  294.       }
  295.     }
  296.   }
  297.  
  298.   else
  299.   {
  300.     for(i=0; i<obraz->wymy; i++) /* petla zamieniajaca wartosci pikseli na wartosc po progowaniu */
  301.     {
  302.       for(j=0; j<obraz->wymx; j++)
  303.       {
  304.         if(obraz->sz[i][j]<=prog)
  305.         {
  306.           obraz->sz[i][j]=0;
  307.         }
  308.         else
  309.         {
  310.           obraz->sz[i][j]=obraz->szarosci;
  311.         }
  312.       }
  313.     }
  314.   }
  315. }
  316.  
  317.  
  318. void konturowanie(Obraz* obraz)
  319. {
  320.   /* funkcja wykonujaca konturowanie obrazu */
  321.   int i,j;  /*  zmienne pomocnicze          */
  322.  
  323.   if(obraz->kolor)    /* sprawdzenie czy obraz jest kolorowy   */
  324.   {
  325.     for (i=0; i<(obraz->wymy-1); ++i)
  326.     {
  327.       for(j=0; j<(obraz->wymx-1); ++j)
  328.       {
  329.         obraz->r[i][j]=abs(obraz->r[i+1][j]-obraz->r[i][j])+abs(obraz->r[i][j+1]-obraz->r[i][j]);
  330.         obraz->g[i][j]=abs(obraz->g[i+1][j]-obraz->g[i][j])+abs(obraz->g[i][j+1]-obraz->g[i][j]);
  331.         obraz->b[i][j]=abs(obraz->b[i+1][j]-obraz->b[i][j])+abs(obraz->b[i][j+1]-obraz->b[i][j]);
  332.       }
  333.     }
  334.  
  335.   }
  336.  
  337.   else
  338.   {
  339.     for (i=0; i<(obraz->wymy-1); ++i)
  340.     {
  341.       for(j=0; j<(obraz->wymx-1); ++j)
  342.       {
  343.         obraz->sz[i][j]=abs(obraz->sz[i+1][j]-obraz->sz[i][j])+abs(obraz->sz[i][j+1]-obraz->sz[i][j]);
  344.       }
  345.     }
  346.   }
  347.  
  348. }
  349.  
  350. void konwertuj_do_szarosci(Obraz* obraz)
  351. {
  352.   /* funkcja wykonujaca konwersje do szarosci */
  353.   int i,j;
  354.  
  355.   if(!obraz->kolor)    /* jesli obraz nie jest kolorowy  */
  356.   {
  357.       fprintf(stderr,"To nie jest obraz kolorowy\n");
  358.       sleep (1);
  359.       return;
  360.   }
  361.  
  362.   obraz->kolor=0;
  363.   for(i=0; i<obraz->wymy; ++i)
  364.   {
  365.       for(j=0; j<obraz->wymx; ++j)
  366.       {
  367.           obraz->sz[i][j]=(obraz->r[i][j]+obraz->g[i][j]+obraz->b[i][j])/3;
  368.       }
  369.   }
  370. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement