Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.36 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <time.h>
  6.  
  7.  
  8.  
  9. // deklaracja struktury obraz
  10. // elementy struktury: szerokosc obrazu, wysokosc obrazu, glebia(liczba oznaczajaca biel, 0 oznacza czern)
  11. // wskaznik na tablice danych
  12. // wskaznik na nazwe zmiennej strukturalnej
  13. struct obraz
  14. {
  15.     int szerokosc;
  16.     int wysokosc;
  17.     int glebia;
  18.     int **dane;
  19.     char nazwa[50];
  20.  
  21. };
  22.  
  23. // funkcja zwalniajaca pamiec zaalokowana na przechowywanie obrazu
  24. // jako argument przekazujemy wskaznik na adres pamieci
  25. void zwolnij_obraz(struct obraz ** ptr)
  26. {
  27.     int i;
  28.     if (ptr == NULL || *ptr == NULL) return;
  29.     {
  30.         if ((*ptr)->dane != NULL)
  31.         {
  32.             for (i = 0; i < (*ptr)->wysokosc; ++i) free((*ptr)->dane[i]);
  33.             free((*ptr)->dane);
  34.         }
  35.         free(*ptr);
  36.         *ptr = NULL;
  37.  
  38.     }
  39.  
  40. }
  41. // funkcja alokujaca pamiec na strukture obrazu
  42. // jako argumenty przyjmuje wysokosc obrazu, szerokosc obrazu i glebie obrazu
  43. // zwraca wartosc wskaznika na zaalokowana pamiec
  44. // w przypadku bledu zwraca NULL
  45. struct obraz *alokacja_pam(int _wys, int _szer, int _gleb)
  46. {
  47.     struct obraz * ptr;
  48.     int i;
  49.     ptr = (struct obraz *)malloc(sizeof(struct obraz));
  50.     if (ptr == NULL) return NULL;
  51.     ptr->szerokosc = _szer;
  52.     ptr->wysokosc = _wys;
  53.     ptr->glebia = _gleb;
  54.     ptr->dane = (int**)malloc(sizeof(int*)*_wys);
  55.     if (ptr->dane == NULL)
  56.     {
  57.         zwolnij_obraz(&ptr);
  58.         return NULL;
  59.     }
  60.     for (i = 0; i < _wys; ++i)
  61.     {
  62.         ptr->dane[i] = (int*)calloc(_szer, sizeof(int));
  63.         if (ptr->dane[i] == NULL)
  64.         {
  65.             zwolnij_obraz(&ptr);
  66.             return NULL;
  67.         }
  68.     }
  69.  
  70.     return ptr;
  71.  
  72. }
  73. // funkcja wczytujaca pojednyncze znaki z pliku obrazu
  74. // jako argument przekazywany jest deskryptor pliku
  75. // zwraca liczbe odczytana z pliku
  76. // val- wartosc liczbowa, zn - znak
  77. int wczytajliczbe(FILE *f)
  78. {
  79.  
  80.  
  81.     char buf[10];
  82.     int val; // wartosc
  83.     char zn; // znak
  84.     while (1)
  85.     {
  86.         if (fscanf(f, " %s", buf) != 1) return -1; // zczytuje do spacji, ew 10
  87.         if (sscanf(buf, "%d", &val) == 1) return val; // zczytuje wartosc w znaku
  88.         if (buf[0] == '#')
  89.         {
  90.  
  91.             do
  92.             {
  93.                 zn = fgetc(f); // konczy wraz koncem lini
  94.             } while (zn != '\n' && zn >= 0);
  95.         }
  96.     }
  97.  
  98. }
  99. // funkcja wczytujaca plik pgm i zapisujaca go jako strukture "obraz"
  100. // przyjmuje jako argument wskaznik na  zmienna strukturalna
  101. // i, j - operatory petli, wysokosc szerokosc i glebia obrazu,
  102. // w przypadku bledu zwraca wartosc 0
  103. struct obraz * load_obraz(struct obraz * wczytywany)
  104. {
  105.  
  106.     FILE *f;
  107.  
  108.     f = NULL;
  109.     int i, j;
  110.     char buf[20];
  111.     char *nazwa;
  112.     int wysokosc, szerokosc, glebia;
  113.     nazwa = (char*)malloc(sizeof(char) * 100);
  114.     if (nazwa == NULL) return 0;
  115.     while (f == NULL)
  116.     {
  117.         printf("Podaj sciezke pliku, ktory chcesz wczytac\n\t- ");
  118.         scanf("%s", nazwa);
  119.         f = fopen(nazwa, "r");
  120.         while (buf[0] != 'P' || buf[1] != '2')
  121.         {
  122.             while (f == NULL)
  123.             {
  124.                 printf("\n\nNie udalo sie wczytac pliku \"%s\"\nPodaj sciezke pliku jeszcze raz\t- ", nazwa);
  125.                 scanf("%s", nazwa);
  126.                 f = fopen(nazwa, "r");
  127.             }
  128.             fscanf(f, "%s", buf);
  129.             if (buf[0] != 'P' || buf[1] != '2')
  130.             {
  131.                 printf("\n\nBledny format pliku.\n");
  132.                 f = NULL;
  133.                 fclose(f);
  134.             }
  135.  
  136.  
  137.             szerokosc = wczytajliczbe(f);
  138.             if (szerokosc < 1)
  139.             {
  140.                 printf("\n\nPlik uszkodzony, nieprawidlowa szerokosc.\n\n");
  141.                 f = NULL;
  142.                 fclose(f);
  143.             }
  144.             else
  145.             {
  146.                 wysokosc = wczytajliczbe(f);
  147.                 if (wysokosc < 1)
  148.                 {
  149.                     printf("\n\nPlik uszkodzony, nieprawidlowa wysokosc.\n\n");
  150.                     f = NULL;
  151.                     fclose(f);
  152.                 }
  153.                 else
  154.                 {
  155.                     glebia = wczytajliczbe(f);
  156.                     if (glebia < 1)
  157.                     {
  158.                         printf("\n\nPlik uszkodzony, nieprawidlowa wartosc maksymalna pola.\n\n");
  159.                         f = NULL;
  160.                         fclose(f);
  161.                     }
  162.                     else
  163.                     {
  164.                         wczytywany = alokacja_pam(wysokosc, szerokosc, glebia);
  165.                         for (i = 0; i < (*wczytywany).wysokosc; i++)
  166.                         {
  167.                             for (j = 0; j < (*wczytywany).szerokosc; j++)
  168.                             {
  169.                                 (*wczytywany).dane[i][j] = wczytajliczbe(f);
  170.                             }
  171.                         }
  172.                     }
  173.                 }
  174.             }
  175.         }fclose(f);
  176.     }return wczytywany;
  177. }
  178.  
  179.  
  180. // funkcja zapisujaca obraz w pliku w formacie pgm
  181. //przyjmuje strukture jako argument
  182. void zapis(struct obraz **zapisywany)
  183. {
  184.  
  185.     char adres[50];
  186.     int i, j;
  187.     FILE *f = NULL;
  188.     printf("Gdzie chcesz go aktualnie zapisac?\n\n  -");
  189.     scanf("%s", adres);
  190.     f = fopen(adres, "w");
  191.     while (f == NULL)
  192.     {
  193.         printf("\n\nAdres nieprawidlowy, podaj nowy\n   -");
  194.         scanf("%s", adres);
  195.         f = fopen(adres, "w");
  196.         if ((f = fopen(adres, "w")) == NULL)
  197.             printf("Nie mogê otworzyæ pliku  do zapisu!\n");
  198.     }
  199.     if (fprintf(f, "P2\n%d %d \n%d \n", (*zapisywany)->szerokosc, (*zapisywany)->wysokosc, (*zapisywany)->glebia) < 1)
  200.     {
  201.         printf("\nNie udalo sie zapisac pliku!\n");
  202.         fclose(f);
  203.         return;
  204.     }
  205.     for (i = 0; i < (*zapisywany)->wysokosc; i++)
  206.     {
  207.         for (j = 0; j < (*zapisywany)->szerokosc; j++)
  208.             if (fprintf(f, "%d ", (*zapisywany)->dane[i][j]) < 1)
  209.             {
  210.                 printf("\nNie udalo sie zapisac pliku!\n");
  211.                 fclose(f);
  212.                 return;
  213.             }
  214.         fprintf(f, "\n");
  215.     }
  216.     printf("\n\n\n\nZapis zakonczony pomyslnie.\n\n\n\n");
  217.     //(*zapisywany)->nazwa = adres;
  218.     fclose(f);
  219.  
  220. }
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228. //funkcja obracajaca obraz w prawo o 90stopni
  229. // przyjmuje podwojny wskaznik na strukture obrazu, zwraca wskaznik na strukture obroconego
  230. // w przypadku bledu zwraca 0
  231. struct obraz *obrot(struct obraz **obr)
  232. {
  233.     int i, j;
  234.     struct obraz * nowy;
  235.     int szerokosc, wysokosc;
  236.     szerokosc = (*obr)->wysokosc;
  237.     wysokosc = (*obr)->szerokosc;
  238.  
  239.     nowy = alokacja_pam(wysokosc, szerokosc, (**obr).glebia);
  240.     if (nowy == NULL)
  241.     {
  242.         printf("Nie udalo sie obrocic. :(\n");
  243.         return 0;
  244.     }
  245.     for (i = 0; i < wysokosc; ++i)
  246.     {
  247.         for (j = 0; j < szerokosc; ++j)
  248.         {
  249.             (*nowy).dane[i][j] = (*obr)->dane[szerokosc - j - 1][i];
  250.  
  251.         }
  252.  
  253.     }
  254.     zwolnij_obraz(obr);
  255.     *obr = nowy;
  256.     return *obr;
  257. }
  258.  
  259. // funkcja odbijajaca wzgledem osi pionowej
  260. //przyjmuje podwojny wskaznik na strukture obrazu
  261. // zwraca wskaznik na strukture odbitego obrazu
  262. // w przypadku bledu zwraca 0
  263. struct obraz *odbity(struct obraz **wczytywany)
  264. {
  265.     int i;
  266.     int j;
  267.     struct obraz * nowy;
  268.     int szerokosc, wysokosc;
  269.     szerokosc = (*wczytywany)->szerokosc;
  270.     wysokosc = (*wczytywany)->wysokosc;
  271.  
  272.     nowy = alokacja_pam(wysokosc, szerokosc, (**wczytywany).glebia);
  273.     if (nowy == NULL)
  274.     {
  275.         printf("Nie udalo sie odbic. :(\n");
  276.         return 0;
  277.     }
  278.     for (i = 0; i < wysokosc; ++i)
  279.     {
  280.         for (j = 0; j < szerokosc; ++j)
  281.         {
  282.             (*nowy).dane[i][j] = (*wczytywany)->dane[i][szerokosc - j];
  283.  
  284.         }
  285.  
  286.     }
  287.  
  288.     zwolnij_obraz(wczytywany);
  289.     *wczytywany = nowy;
  290.     return *wczytywany;
  291.  
  292. }
  293.  
  294.  
  295. // funkcja wprowadzajaca negatyw
  296. // przyjmuje podwojny wskaznik na strukture
  297. // zwraca wskaznik na strukture obrazu
  298. // w przypadku bledu zwraca 0
  299. struct obraz *negatyw(struct obraz **wczytywany)
  300. {
  301.     int i, j;
  302.     struct obraz * nowy;
  303.     int szerokosc, wysokosc;
  304.     szerokosc = (*wczytywany)->szerokosc;
  305.     wysokosc = (*wczytywany)->wysokosc;
  306.  
  307.     nowy = alokacja_pam(wysokosc, szerokosc, (**wczytywany).glebia);
  308.     if (nowy == NULL)
  309.     {
  310.         printf("Nie udalo sie odbic. :(\n");
  311.         return 0;
  312.     }
  313.     for (i = 0; i < wysokosc; ++i)
  314.     {
  315.         for (j = 0; j < szerokosc; ++j)
  316.         {
  317.             (*nowy).dane[i][j] = ((**wczytywany).glebia - (**wczytywany).dane[i][j]);
  318.  
  319.         }
  320.  
  321.     }
  322.  
  323.  
  324.     zwolnij_obraz(wczytywany);
  325.     *wczytywany = nowy;
  326.     return *wczytywany;
  327.  
  328. }
  329.  
  330. // funkcja pytajaca uzytkownika o to czy zapisac zmiany
  331. //czesc menu
  332. int czy_zapis()
  333. {
  334.     int a;
  335.     printf("czy chcesz zapisaæ teraz obraz? \n 1- tak \n 2-nie \n");
  336.     scanf("%d", &a);
  337.     return a;
  338. }
  339.  
  340.  
  341. struct obraz *progowanie(struct obraz **wczytywany)
  342. {
  343.     int i, j;
  344.     int prog = (*wczytywany)->glebia / 2;
  345.     struct obraz * nowy;
  346.     int szerokosc, wysokosc;
  347.     if ((*wczytywany)->glebia == 1) return *wczytywany;
  348.     szerokosc = (*wczytywany)->szerokosc;
  349.     wysokosc = (*wczytywany)->wysokosc;
  350.  
  351.     nowy = alokacja_pam(wysokosc, szerokosc, (*wczytywany)->glebia);
  352.     if (nowy == NULL)
  353.     {
  354.         printf("Nie udalo sie sprogowac. :(\n");
  355.         return 0;
  356.     }
  357.     for (i = 0; i < wysokosc; ++i)
  358.     {
  359.         for (j = 0; j < szerokosc; ++j)
  360.         {
  361.             if (((*wczytywany)->dane[i][j]) > prog)
  362.                 (*nowy).dane[i][j] = (*wczytywany)->glebia;
  363.  
  364.             else
  365.                 (*nowy).dane[i][j] = 0;
  366.  
  367.         }
  368.     }
  369.  
  370.     zwolnij_obraz(wczytywany);
  371.     *wczytywany = nowy;
  372.     return *wczytywany;
  373.  
  374. }
  375.  
  376. int main()
  377. {
  378.     int wyboruzyt;
  379.     struct obraz wczytywany;
  380.     struct obraz *ptr = NULL;
  381.     do
  382.     {
  383.         printf("Czy chcesz:\n 1 -wczytac obraz\n 2 - obrocic obraz\n 3 - odbic obraz\n 4 - uzyc negatywu\n  5- Progowanie \n 6 -zmienic jasnosc \n 7 - wprowadzic kontrast\n ");
  384.         printf(" 0 - wyjsc\n  Twoj wybor to:   ");
  385.         scanf("%d", &wyboruzyt);
  386.  
  387.         switch (wyboruzyt)
  388.         {
  389.         case 1: // wczytaj obraz
  390.             if (ptr != NULL) zwolnij_obraz(&ptr);
  391.             ptr = load_obraz(&wczytywany);
  392.             if (czy_zapis() == 1) zapis(&ptr);
  393.             break;
  394.  
  395.         case 2:  //obroc obraz
  396.             if (ptr == NULL)
  397.             {
  398.                 printf("prosze wczytac najpierw obraz");
  399.                 break;
  400.             }
  401.             ptr = obrot(&ptr);
  402.             if (ptr == 0) printf("blad");
  403.             if (czy_zapis() == 1) zapis(&ptr);
  404.             break;
  405.  
  406.         case 3:  //odbij
  407.             if (ptr == NULL)
  408.             {
  409.                 printf("prosze wczytac najpierw obraz");
  410.                 break;
  411.             }
  412.             ptr = odbity(&ptr);
  413.             if (ptr == 0) printf("blad");
  414.             if (czy_zapis() == 1) zapis(&ptr);
  415.             break;
  416.  
  417.         case 4:  // negatyw
  418.             if (ptr == NULL)
  419.             {
  420.                 printf("prosze wczytac najpierw obraz");
  421.                 break;
  422.             }
  423.             ptr = negatyw(&ptr);
  424.             if (ptr == 0) printf("blad");
  425.             if (czy_zapis() == 1) zapis(&ptr);
  426.             break;
  427.  
  428.         case 5:
  429.             if (ptr == NULL)
  430.             {
  431.                 printf("prosze wczytac najpierw obraz");
  432.                 break;
  433.             }
  434.             ptr = progowanie(&ptr);
  435.             if (czy_zapis() == 1) zapis(&ptr);
  436.             break;
  437.  
  438.         case 6: // zmien jasnosc
  439.             printf("prosze wprowadzić wartość z zakresu -100 do 100\n");
  440.             if (ptr != NULL) zwolnij_obraz(&ptr);
  441.            
  442.             break;     
  443.         case 7: // wprowadz kontrast
  444.             printf("prosze wprowadzić wartość z zakresu -100 do 100\n");
  445.             if (ptr != NULL) zwolnij_obraz(&ptr);
  446.            
  447.             break;     
  448.         case 8: // przeswietlenia
  449.             printf("prosze wprowadzić wartość z zakresu -100 do 100\n");
  450.             if (ptr != NULL) zwolnij_obraz(&ptr);
  451.            
  452.             break;     
  453.  
  454.         case 9: // cienie
  455.             printf("prosze wprowadzić wartość z zakresu -100 do 100\n");
  456.             if (ptr != NULL) zwolnij_obraz(&ptr);
  457.            
  458.             break;     
  459.  
  460.         case 0: // w uprzejmy sposob konczy dzialanie programu
  461.             printf("do zobaczenia :) \n");
  462.             zwolnij_obraz(&ptr);
  463.             break;
  464.  
  465.         default: printf("nie ma takiej opcji. Wybierz jedna z dostepnych ponizej \n");
  466.         }
  467.  
  468.  
  469.     } while (wyboruzyt != 6);
  470. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement