Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX 512 // maksymalny rozmiar obrazu
- #define DL_LINII 1024 // dlugosc buforow pomocniczych
- // ODCZYT OBRAZU Z PLIKU DO TABLICY:
- int czytaj (FILE *plik_wej, int obraz_pgm [][512], int *wymX, int *wymY, int *szarosci)
- {
- char buff [DL_LINII]; // bufor pomocniczy
- int znak; // zmienna pomocnicza
- int koniec; // monitorowanie konca danych w pliku
- int i, j;
- // KONTROLA POPRAWNOSCI PLIKU:
- if (plik_wej == NULL)
- {
- fprintf (stderr, "Blad: podany plik jest nieprawidlowy!\n");
- return 0;
- }
- // "NUMER MAGICZNY":
- if (fgets (buff, DL_LINII, plik_wej) == NULL) koniec = 1; // wczytanie pierwsze linii z pliku
- if (buff [0] != 'P' || buff [1] != '2' || koniec)
- {
- fprintf (stderr, "Blad: podany plik nie jest plikiem PGM!\n");
- return 0;
- }
- // POMIJANIE KOMENTARZY:
- do {
- if ((znak = fgetc(plik_wej)) == '#')
- {
- if (fgets(buff, DL_LINII, plik_wej) == NULL) koniec=1;
- else ungetc(znak, plik_wej);
- }
- } while (znak == '#' && !koniec);
- // POBRANIE PARAMETROW OBRAZU:
- if (fscanf (plik_wej, "%d %d %d", wymX, wymY, szarosci) != 3)
- {
- fprintf (stderr, "Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
- return(0);
- }
- // ZAPISANIE OBRAZU W TABLICY:
- for (i=0; i<*wymY; i++)
- {
- for (j=0; j<*wymX; j++)
- {
- if (fscanf(plik_wej, "%d " ,&(obraz_pgm [i][j])) != 1)
- {
- fprintf (stderr, "Blad: Niewlasciwe wymiary obrazu\n");
- return(0);
- }
- }
- }
- return *wymX * *wymY;
- }
- // WYSWIETLANIE OBRAZU:
- void wyswietl (char *nazwa_pliku)
- {
- char polecenie [DL_LINII]; // bufor pomocniczy do zestawienia polecenia
- strcpy (polecenie, "display "); // konstrukcja polecenia postaci
- strcat (polecenie, nazwa_pliku); // display "nazwa_pliku" &
- strcat (polecenie, " &");
- printf ("%s\n", polecenie); // wydruk kontrolny polecenia
- system (polecenie); // wykonanie polecenia
- }
- // ZAPISYWANIE OBRAZU DO PLIKU PGM:
- int zapisz (FILE *plik_wyj, int obraz_pgm [][MAX], int wymX, int wymY, int szarosci)
- {
- int i, j;
- fprintf (plik_wyj, "P2\n");
- fprintf (plik_wyj, "%d %d\n", wymX, wymY);
- fprintf (plik_wyj, "%d\n", szarosci);
- for (i=0; i<wymY; i++)
- {
- for (j=0; j<wymX; j++)
- {
- fprintf (plik_wyj, "%d ", obraz_pgm [i][j]);
- }
- fprintf (plik_wyj, "\n");
- }
- return 0;
- }
- // NEGATYW:
- int negatyw (int obraz_pgm [][MAX], int *wymX, int *wymY, int szarosci)
- {
- int i, j;
- for (i=0; i<*wymY;++i)
- {
- for (j=0; j<*wymX;++j) obraz_pgm [i][j] = szarosci - obraz_pgm [i][j];
- }
- }
- // KONTUROWANIE:
- int konturowanie (int obraz_pgm [][MAX], int *wymX, int *wymY)
- {
- int i, j;
- for (i=0; i<*wymY; ++i)
- {
- for (j=0; j<*wymX; ++j)
- {
- obraz_pgm [i][j] = (abs(obraz_pgm [i+1][j] - obraz_pgm [i][j]) + abs(obraz_pgm [i][j+1] - obraz_pgm [i][j]))/2;
- }
- }
- }
- // PROGOWANIE:
- int progowanie (int obraz_pgm [][MAX], int *wymX, int *wymY, int szarosci, int prog)
- {
- int i, j;
- for (i=0; i<*wymY; ++i)
- {
- for (j=0; j<*wymX; ++j)
- {
- if (obraz_pgm [i][j] <= (szarosci * prog/100)) obraz_pgm [i][j] = 0;
- else obraz_pgm [i][j] = szarosci;
- }
- }
- }
- // PROG BIELI:
- int prog_bieli (int obraz_pgm [][MAX], int *wymX, int *wymY, int szarosci, int prog)
- {
- int i, j;
- for (i=0; i<*wymY; ++i)
- {
- for (j=0; j<*wymX; ++j)
- {
- if (obraz_pgm [i][j] > prog) obraz_pgm [i][j] = szarosci;
- }
- }
- }
- // PROG CZERNI:
- int prog_czerni (int obraz_pgm [][MAX], int *wymX, int *wymY, int szarosci, int prog)
- {
- int i, j;
- for (i=0; i<*wymY; ++i)
- {
- for (j=0; j<*wymX; ++j)
- {
- if (obraz_pgm [i][j] <= prog) obraz_pgm [i][j] = 0;
- }
- }
- }
- int main ()
- {
- int Wybor, Koniec=0;
- int obraz [MAX][MAX], wymX, wymY, szarosci, prog;
- int CzyWczytany = 0;
- FILE *plik;
- char *nazwa_wej;
- char *nazwa_wyj;
- do {
- printf ("\n\n\nProgram do przetwarzania obrazow PGM\n\n");
- printf ("******************************************************\n\n");
- printf (" 1 - WCZYTAJ OBRAZ\n");
- printf (" 2 - ZAPISZ OBRAZ\n");
- printf (" 3 - NEGATYW\n");
- printf (" 4 - KONTUROWANIE\n");
- printf (" 5 - PROGOWANIE\n");
- printf (" 6 - PROG BIELI\n");
- printf (" 7 - PROG CZERNI\n");
- printf (" 8 - WYSWIETL OBRAZ\n");
- printf (" 9 - KONIEC\n\n");
- printf ("******************************************************\n");
- printf ("Twoj wybor: ");
- scanf ("%d", &Wybor);
- switch (Wybor)
- {
- // WCZYTANIE:
- case 1: CzyWczytany = 0;
- printf ("Podaj nazwe pliku: ");
- scanf ("%s", &nazwa_wej);
- printf ("%s", nazwa_wej);
- plik = fopen (nazwa_wej, "r");
- if (czytaj (plik, obraz, &wymX, &wymY, &szarosci) != 0);
- printf ("Obraz wczytany pomyslnie\n");
- CzyWczytany = 1;
- fclose (plik);
- break;
- // ZAPIS:
- case 2: if (CzyWczytany == 0)
- {
- printf ("Blad: Najpierw musisz wczytac obraz!\n");
- break;
- }
- printf ("Podaj nazwe zapisywanego pliku razem z rozszerzeniem: ");
- scanf ("%s", &nazwa_wyj);
- plik = fopen (nazwa_wyj, "w");
- zapisz (plik, obraz, wymX, wymY, szarosci);
- fclose (plik);
- printf ("Plik %s zapisany pomyslnie\n", nazwa_wyj);
- // NEGATYW:
- case 3: if (CzyWczytany == 0)
- {
- printf ("Blad: Najpierw musisz wczytac obraz!\n");
- break;
- }
- negatyw (obraz, &wymX, &wymY, szarosci);
- printf ("Negatywowanie zakonczone\n");
- break;
- // KONTUROWANIE:
- case 4: if (CzyWczytany == 0)
- {
- printf ("Blad: Najpierw musisz wczytac obraz!\n");
- break;
- }
- konturowanie (obraz, &wymX, &wymY);
- printf ("Konturowanie zakonczone\n");
- break;
- // PROGOWANIE:
- case 5: if (CzyWczytany == 0)
- {
- printf ("Blad: Najpierw musisz wczytac obraz!\n");
- break;
- }
- printf ("Podaj wartosc progu (1-100): ");
- scanf ("%d", &prog);
- if (prog<=100 && prog>=1)
- {
- progowanie (obraz, &wymX, &wymY, szarosci, prog);
- printf ("Progowanie zakonczone\n");
- }
- else printf ("Blad: Nieprawidlowa wartosc progu!\n");
- break;
- // PROGOWANIE BIELI:
- case 6: if (CzyWczytany == 0)
- {
- printf ("Blad: Najpierw musisz wczytac obraz!\n");
- break;
- }
- printf ("Podaj wartosc progu (1-100): ");
- scanf ("%d", &prog);
- if (prog<=100 && prog>=1)
- {
- prog_bieli (obraz, &wymX, &wymY, szarosci, prog);
- printf ("Progowanie bieli zakonczone\n");
- }
- else printf ("Blad: Nieprawidlowa wartosc progu!\n");
- break;
- // PROGOWANIE CZERNI:
- case 7: if (CzyWczytany == 0)
- {
- printf ("Blad: Najpierw musisz wczytac obraz!\n");
- break;
- }
- printf ("Podaj wartosc progu (1-100): ");
- scanf ("%d", &prog);
- if (prog<=100 && prog>=1)
- {
- prog_czerni (obraz, &wymX, &wymY, szarosci, prog);
- printf ("Progowanie czerni zakonczone\n");
- }
- else printf ("Blad: Nieprawidlowa wartosc progu!\n");
- break;
- // WYSWIETLENIE OBRAZU:
- case 8: if (CzyWczytany == 0)
- {
- printf ("Blad: Najpierw musisz wczytac obraz!\n");
- break;
- }
- wyswietl (nazwa_wej);
- break;
- case 9: printf ("Program zakonczyl dzialanie\n");
- Koniec = 1;
- }
- } while (Koniec == 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement