Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.24 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #include<math.h>
  6. #include <string.h>
  7.  
  8. #define MAX_SZEROKOSC 1024
  9.  
  10. struct OBRAZ {
  11.     int x, y, skala;
  12.     int **pixel;
  13. };
  14.  
  15. struct OBRAZ *Moj_Pierwszy_Obraz(int, int, int);
  16. struct OBRAZ *Gradient_gora_dol(int, int, int);
  17. void Szum(struct OBRAZ*);
  18. struct OBRAZ* wczytaj(char*);
  19. void Negatyw(struct OBRAZ*);
  20.  
  21. void Zapis(struct OBRAZ*);
  22. void UsunObraz(struct OBRAZ*);
  23. void Jaskrawosc(struct OBRAZ*);
  24. void Kontrast(struct OBRAZ* obraz);
  25. void Kontrast2(struct OBRAZ* obraz);
  26. int iloscCzarnychPikseli(struct OBRAZ* obraz);
  27. void menu();
  28.  
  29. //void ZwalnianiePamieci(struct OBRAZ*);
  30. int main() {
  31.     menu();
  32.     /*
  33.     printf("1) Gradient L->P 2) Gradient G->D\n");
  34.     scanf("%d", &menu);
  35.  
  36.     if (menu == 1) {
  37.     obraz = Moj_Pierwszy_Obraz(256, 256, 255);
  38.     }
  39.     else {
  40.     obraz = Gradient_gora_dol(256, 256, 255);
  41.     }
  42.  
  43.     Szum(obraz);
  44.     Zapis(obraz);
  45.     //Zapis(Moj_Pierszy_Obraz(256, 256, 255); <-to jest to samo co to wyĹźej
  46.     //ZwalnianiePamieci(obraz);
  47.  
  48.     */
  49.     system("pause");
  50.     return 0;
  51. }
  52. void Szum(struct OBRAZ* obraz)
  53. {
  54.     int i, j, tmp;
  55.     srand(time(NULL));
  56.     for (i = 0; i < obraz->y; i++) {
  57.         for (j = 0; j < obraz->x; j++) {
  58.             tmp = (obraz->skala - obraz->pixel[i][j]);
  59.             if (tmp == 0) {
  60.  
  61.             }
  62.             else {
  63.                 tmp %= 20;
  64.                 obraz->pixel[i][j] += rand() % (tmp + 1);
  65.             }
  66.  
  67.         }
  68.     }
  69. }
  70. struct OBRAZ*Moj_Pierwszy_Obraz(int szer, int wys, int szar)
  71. {
  72.     struct OBRAZ *wsk_na_str;
  73.     int i, j;
  74.     wsk_na_str = (struct OBRAZ*)malloc(sizeof(struct OBRAZ));
  75.  
  76.     wsk_na_str->x = szer;
  77.     wsk_na_str->y = wys;
  78.     wsk_na_str->skala = szar;
  79.  
  80.     wsk_na_str->pixel = (int**)calloc(wsk_na_str->x, sizeof(int));
  81.     for (i = 0; i < wsk_na_str->x; i++)
  82.     {
  83.         wsk_na_str->pixel[i] = (int*)calloc(wsk_na_str->y, sizeof(int));
  84.     }
  85.     for (i = 0; i < wsk_na_str->x; i++) {
  86.         for (j = 0; j < wsk_na_str->y; j++)
  87.         {
  88.             wsk_na_str->pixel[i][j] = j;
  89.         }
  90.     }
  91.  
  92.     return wsk_na_str;
  93.  
  94.  
  95. }
  96.  
  97. struct OBRAZ*Gradient_gora_dol(int szer, int wys, int szar)
  98. {
  99.     struct OBRAZ *wsk_na_str;
  100.     int i, j;
  101.     wsk_na_str = (struct OBRAZ*)malloc(sizeof(struct OBRAZ));
  102.  
  103.     wsk_na_str->x = szer;
  104.     wsk_na_str->y = wys;
  105.     wsk_na_str->skala = szar;
  106.  
  107.     wsk_na_str->pixel = (int**)calloc(wsk_na_str->x, sizeof(int));
  108.     for (i = 0; i < wsk_na_str->x; i++)
  109.     {
  110.         wsk_na_str->pixel[i] = (int*)calloc(wsk_na_str->y, sizeof(int));
  111.     }
  112.  
  113.  
  114.     for (i = 0; i < wsk_na_str->x; i++) {
  115.         for (j = 0; j < wsk_na_str->y; j++)
  116.         {
  117.             wsk_na_str->pixel[i][j] = i;
  118.         }
  119.     }
  120.  
  121.  
  122.     return wsk_na_str;
  123. }
  124. void Zapis(struct OBRAZ *do_Zapisu)
  125. {
  126.     int i, j;
  127.     FILE *wsk;
  128.     char bufor[MAX_SZEROKOSC];
  129.     printf("Podaj nazwe pliku do zapisania: ");
  130.     scanf("%s", bufor);
  131.     wsk = fopen(bufor, "w");
  132.  
  133.     fprintf(wsk, "%s\n", "P2");
  134.     //fprintf(wsk, "%s\n", "# komentarz");
  135.     fprintf(wsk, "%d %d\n", do_Zapisu->x, do_Zapisu->y);
  136.     fprintf(wsk, "%d\n", do_Zapisu->skala);
  137.     for (j = 0; j < do_Zapisu->y; j++) {
  138.         for (i = 0; i < do_Zapisu->x; i++) {
  139.             fprintf(wsk, "%d ", do_Zapisu->pixel[j][i]);
  140.         }
  141.         fprintf(wsk, "\n");
  142.     }
  143.     fclose(wsk);
  144. }
  145. struct OBRAZ* wczytaj(char* nazwa) {
  146.     int i, j, tmp;
  147.     struct OBRAZ* obraz;
  148.     char bufor[MAX_SZEROKOSC];
  149.  
  150.     FILE* plik;
  151.     plik = fopen(nazwa, "r");
  152.  
  153.     if (plik == NULL) {
  154.         printf("Nie udalo sie otworzyc pliku do odczytu\n");
  155.         return NULL;
  156.     }
  157.  
  158.     obraz = (struct OBRAZ*)calloc(1, sizeof(struct OBRAZ));
  159.     if (obraz == NULL) {
  160.         printf("Nie udalo sie zaalokowac pamieci na strukture\n");
  161.         return NULL;
  162.     }
  163.  
  164.     // wczytanie pierwszej linijki
  165.     fgets(bufor, MAX_SZEROKOSC, plik);
  166.  
  167.     // sprawdzenie czy plik zaczyna sie od P2 lub P5
  168.     if (!(bufor[0] == 'P' && (bufor[1] == '2' || bufor[1] == '5'))) {
  169.         printf("Sprobowano otworzyc niewspierany format pliku\n");
  170.         return NULL;
  171.     }
  172.  
  173.     do {
  174.         // wczytaj linijke
  175.         fgets(bufor, MAX_SZEROKOSC, plik);
  176.  
  177.         // jezeli w linijce jest komentarz to przejdz na poczatek petli
  178.         // i zostanie wczytana kolejna linijka
  179.         if (strchr(bufor, '#')) {
  180.             continue;
  181.         }
  182.         else { // jezeli w linijce nie ma # to wyjdz z petli
  183.             break;
  184.         }
  185.     } while (1);
  186.  
  187.     // przesuniecie na poczatek poprzedniej linijki
  188.     fseek(plik, ftell(plik) - strlen(bufor) - 1, SEEK_SET);
  189.  
  190.     // wczytanie informacji o szerokosci wysokosci i skali obrazu
  191.     fscanf(plik, "%d%d%d", &obraz->x, &obraz->y, &obraz->skala);
  192.  
  193.     printf("Wczytano dane o obrazie x = %d y = %d skala = %d\n",
  194.            obraz->x, obraz->y, obraz->skala);
  195.  
  196.  
  197.     // zaalokowanie pamieci na pixele obrazu
  198.     obraz->pixel = (int**)calloc(obraz->y, sizeof(int*));
  199.     if (obraz->pixel == NULL) {
  200.         printf("Nie udalo sie zaalokowac pamieci na wiersze.\n");
  201.         return NULL;
  202.     }
  203.     for (i = 0; i < obraz->y; i++) {
  204.         obraz->pixel[i] = (int*)calloc(obraz->x, sizeof(int));
  205.         if (obraz->pixel[i] == NULL) {
  206.             printf("Nie udalo sie zaalokwoac pamieci na kolumne.\n");
  207.             return NULL;
  208.         }
  209.     }
  210.  
  211.     // wczytwanie pixeli z obrazu
  212.  
  213.     //printf("Wczytuje dane z obrazu: \n");
  214.     for (i = 0; i < obraz->y; i++) {
  215.         for (j = 0; j < obraz->x; j++) {
  216.             fscanf(plik, "%d", &tmp);
  217.             obraz->pixel[i][j] = tmp;
  218.             //printf("%5d", obraz->pixel[i][j]);
  219.         }
  220.         //printf("Wczytano linijke nr: %d\n", i + 1);
  221.         //system("pause");
  222.     }
  223.  
  224.  
  225.     fclose(plik);
  226.     return obraz;
  227. }
  228.  
  229. void menu() {
  230.     char nazwa[MAX_SZEROKOSC];
  231.     int wybor;
  232.     struct OBRAZ* aktualnyObraz;
  233.  
  234.     do {
  235.         printf("Podaj nazwe pliku z rozszerzeniem: ");
  236.         scanf("%s", nazwa);
  237.  
  238.         aktualnyObraz = wczytaj(nazwa);
  239.  
  240.         if (aktualnyObraz == NULL) {
  241.             printf("Nie udalo sie otworzyc obrazu o podanej nazwie.\nSprobuj ponownie.\n");
  242.         }
  243.         else {
  244.             printf("Wczytano poprawnie obraz.\n");
  245.             break;
  246.         }
  247.     } while (1);
  248.  
  249.     do {
  250.         printf("1) Zaszum\n2) Negatyw\n3) Jaskrawosc\n4) Kontrast \n5) Kontrast2 \n6) Ilosc czarnych pikseli\n7) Wyjscie\n");
  251.         scanf("%d", &wybor);
  252.  
  253.         switch (wybor) {
  254.             case 1:
  255.                 Szum(aktualnyObraz);
  256.                 break;
  257.             case 2:
  258.                 Negatyw(aktualnyObraz);
  259.                 break;
  260.             case 3:
  261.                 Jaskrawosc(aktualnyObraz);
  262.                 break;
  263.             case 4:
  264.                 Kontrast(aktualnyObraz);
  265.                 break;
  266.             case 5:
  267.                 Kontrast2(aktualnyObraz);
  268.                 break;
  269.             case 6:
  270.                 printf("Ilosc czarnych pikseli = %d\n", iloscCzarnychPikseli(aktualnyObraz));
  271.                 break;
  272.         }
  273.         if (wybor != 7) {
  274.  
  275.             printf("Czy chcesz zapisac wynik? [1\\0]: ");
  276.             scanf("%d", &wybor);
  277.             if (wybor == 1) {
  278.                 Zapis(aktualnyObraz);
  279.             }
  280.         }
  281.  
  282.     } while (wybor != 7);
  283.  
  284.     UsunObraz(aktualnyObraz);
  285. }
  286.  
  287. void Negatyw(struct OBRAZ* obraz) {
  288.     int i, j;
  289.  
  290.     if (obraz == NULL) {
  291.         printf("Wskaznik na obraz == NULL.\n");
  292.         return;
  293.     }
  294.  
  295.     for (i = 0; i < obraz->y; i++) {
  296.         for (j = 0; j < obraz->x; j++) {
  297.             obraz->pixel[i][j] = obraz->skala - obraz->pixel[i][j];
  298.         }
  299.     }
  300. }
  301.  
  302. void UsunObraz(struct OBRAZ* obraz) {
  303.     int i;
  304.  
  305.     if (obraz == NULL) {
  306.         printf("Wskaznik na obraz == NULL.\n");
  307.         return;
  308.     }
  309.  
  310.     for (i = 0; i < obraz->y; i++) {
  311.         free(obraz->pixel[i]);
  312.     }
  313.  
  314.     free(obraz->pixel);
  315. }
  316.  
  317. void Jaskrawosc(struct OBRAZ* obraz) {
  318.     int i, j, wartosc;
  319.  
  320.     printf("Podaj wartosc jaskrawosci: ");
  321.     scanf("%d", &wartosc);
  322.  
  323.     for (i = 0; i < obraz->y; i++) {
  324.         for (j = 0; j < obraz->x; j++) {
  325.             if (obraz->pixel[i][j] + wartosc > obraz->skala) {
  326.                 obraz->pixel[i][j] = obraz->skala;
  327.             }
  328.             else if (obraz->pixel[i][j] + wartosc < 0) {
  329.                 obraz->pixel[i][j] = 0;
  330.             }
  331.             else {
  332.                 obraz->pixel[i][j] = obraz->pixel[i][j] + wartosc;
  333.             }
  334.         }
  335.     }
  336. }
  337.  
  338. void Kontrast(struct OBRAZ* obraz) {
  339.     int i, j, wartosc;
  340.  
  341.     printf("Podaj wartosc kontrastu: ");
  342.     scanf("%d", &wartosc);
  343.  
  344.  
  345.     // kontrast dla wartosci pixela wiekszej od polowy skali odejmuje podana wartosc
  346.     // a dla wartosci pixela mniejszej od polowy skali dodaje wartosc
  347.     for (i = 0; i < obraz->y; i++) {
  348.         for (j = 0; j < obraz->x; j++) {
  349.             // rozjasnienie
  350.             if (obraz->pixel[i][j] > obraz->skala / 2) {
  351.                 if (obraz->pixel[i][j] + wartosc > obraz->skala) {
  352.                     obraz->pixel[i][j] = obraz->skala;
  353.                 }
  354.                 else {
  355.                     obraz->pixel[i][j] += wartosc;
  356.                 }
  357.             }
  358.             else { // sciemnie
  359.                 if (obraz->pixel[i][j] - wartosc < 0) {
  360.                     obraz->pixel[i][j] = 0;
  361.                 }
  362.                 else {
  363.                     obraz->pixel[i][j] -= wartosc;
  364.                 }
  365.             }
  366.         }
  367.     }
  368. }
  369.  
  370. void Kontrast2(struct OBRAZ* obraz) {
  371.     int i, j, wartosc;
  372.  
  373.     // kontrast dla wartosci pixela wiekszej od polowy skali odejmuje podana wartosc
  374.     // a dla wartosci pixela mniejszej od polowy skali dodaje wartosc
  375.     for (i = 0; i < obraz->y; i++) {
  376.         for (j = 0; j < obraz->x; j++) {
  377.             // rozjasnienie
  378.             if (obraz->pixel[i][j] > obraz->skala / 2)
  379.                 obraz->pixel[i][j] = obraz->skala;
  380.             else {
  381.                 obraz->pixel[i][j] = 0;
  382.             }
  383.  
  384.         }
  385.     }
  386. }
  387.  
  388. int iloscCzarnychPikseli(struct OBRAZ* obraz) {
  389.     int i, j, ilosc = 0;
  390.     for (i = 0; i < obraz->y; i++) {
  391.         for (j = 0; j < obraz->x; j++) {
  392.             if(obraz->pixel[i][j] == 0) {
  393.                 ilosc++;
  394.             }
  395.         }
  396.     }
  397.     return ilosc;
  398. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement