#include #include #include #include #define CRT_SECURE_NO_WARNINGS struct obraz { char title[50]; char standard; //deklaruje strukture na zmienne: standard,szerokosc,wysokosc, int szer; //skala szarosci, obraz(tablica dwuwymiarowa) int wys; int skal_szar; int **obraz; }; void wczytajplik(struct obraz *tablica, int *licznik_obraz); //wybor pliku, wczytywanie, alokowanie pamieci void bufor(); //funkcja czyszczaca bufor klawiatury void drukujobraz(struct obraz* tablica, int *aktobraz); //drukowanie obrazu w konsoli void fri(struct obraz* o1); //uwalnianie tablicy dwuwymiarowej void zapiszobraz(struct obraz* tablica, int *aktobraz); struct obraz* usunobraz(struct obraz* tablica, int *aktobraz, int licznik_obraz); struct obraz* realokuj(struct obraz *tablica, int licznik_obraz); void filtr_gaussa(struct obraz* tablica, int aktobraz, int **kopia); void tworz_kopie(struct obraz* tablica, int aktobraz, int **kopia); int main() { struct obraz *tablica; //tworze wskaznik na tablice struktur int licznik_obraz = 1, i, **kopia; //licznik_obraz zlicza ile aktualnie w programie jest obrazow int aktobraz = 0; //wybiera ktory obraz jest aktywny (domyslnie 0) char menu; menu = 'z'; tablica = malloc(1 * sizeof(struct obraz)); //alokujê tablice na rozmiar 1 struktury while (menu != 'a') //petla pozwalajaca na wielokrotne wybieranie funckji z menu { printf("nWybierz jedna opcje z Menuna. Wyjscienb. Dodaj obraznc. Pokaz obraz w konsolind. Lista obrazowne. Zapisz obraz do pliku .pgmnf. Usun aktywny obrazng. Filtr Gaussa"); while (_kbhit() == 0); //petla oczekujace na wcisniecie przycisku na klawiaturze menu = _getch(); switch (menu) { case 'a': //WYJSCIE, czysci tablice 2-wym, tablice struktur if (sizeof(tablica)>20 * sizeof(int)) { for (i = 0; i1) { do { bufor(); printf("nWybierz aktywny obraz:n"); scanf("%d", &aktobraz); } //pozwala na wybranie aktywnego obrazu (tego ktory bedzie uzyty w nastepnych funkcjach) while (aktobraz >= licznik_obraz || aktobraz <= 0); } aktobraz--; break; case'e': //funkcja zapisujaca aktywny obraz do pliku zapiszobraz(tablica, &aktobraz); break; case'f': usunobraz(tablica, &aktobraz, licznik_obraz); //usuwam aktywny obraz i dekrementuje licznik obrazow licznik_obraz--; break; case'g': tworz_kopie(tablica, aktobraz, kopia); printf("dadadn"); filtr_gaussa(tablica, aktobraz, kopia); break; default: printf("nNIE MA TAKIEJ OPCJI W MENUn"); //jezeli uzytkownik wcisnal nieodpowiedni klawisz wyswietlam komunikat break; } } system("pause"); return 0; } void bufor() { int c; while ((c = getc(stdin)) != 'n'&&c != EOF); //czysci bufor klawiatury } void wczytajplik(struct obraz *tablica, int *licznik_obraz) { char help; //zmienne pomocnicza do oczytywania z pliku int helps, i = 0, j = 0, k; char tytul[50]; printf("nPodaj tytul obrazu: "); //wczytuje tytul pliku do otwarcia scanf("%s", tytul); strcpy(tablica[*licznik_obraz - 1].title, tytul); FILE *plik; plik = fopen(tytul, "r"); //otwieram plik while (plik == NULL) { printf("nNIE MA TAKIEGO PLIKU"); //zabezpieczenie przed nieotwartym plikiem printf("nPodaj tytul obrazu: "); scanf("%s", tytul); plik = fopen(tytul, "r"); } fseek(plik, 1, SEEK_SET); fscanf(plik, "%c", &help); tablica[*licznik_obraz - 1].standard = help; //odczytuje standard pliku fseek(plik, 1, SEEK_CUR); //poczatek algorytmu obslugi komentarzy while (getc(plik) == '#') { while (getc(plik) != 'n'); } fseek(plik, -1, SEEK_CUR); //i jego koniec fscanf(plik, "%d", &helps); tablica[*licznik_obraz - 1].wys = helps; fscanf(plik, "%d", &helps); //odczytuje szerokosc,wysokosc,skale szarosci tablica[*licznik_obraz - 1].szer = helps; fseek(plik, 1, SEEK_CUR); //poczatek algorytmu obslugi komentarzy while (getc(plik) == '#') { while (getc(plik) != 'n'); } fseek(plik, -1, SEEK_CUR); //i jego koniec fscanf(plik, "%d", &helps); tablica[*licznik_obraz - 1].skal_szar = helps; fseek(plik, 1, SEEK_CUR); //poczatek algorytmu obslugi komentarzy while (getc(plik) == '#') { while (getc(plik) != 'n'); } fseek(plik, -1, SEEK_CUR); //i jego koniec tablica[*licznik_obraz - 1].obraz = malloc((tablica[*licznik_obraz - 1].szer + 1) * sizeof(*tablica[*licznik_obraz - 1].obraz)); //alokuje pamiec na tablice dwu_wym if (tablica[*licznik_obraz - 1].obraz != NULL) { for (helps = 0; helps= tablica[*licznik_obraz - 1].szer) { if (iszer + 1; helps++) { free(o1->obraz[helps]); //czyszcze tablice "podrzedne" tablicy dwu_wym } free(o1->obraz); //czyszcze tablice "matke" } struct obraz* realokuj(struct obraz *tablica, int licznik_obraz) { //realokowanie tablicy o jenda strukture wiecej struct obraz *temp; poczatek: temp = realloc(tablica, (licznik_obraz + 1) * sizeof(struct obraz)); if (temp != NULL) // sprawdzenie powodzenia realokacji { tablica = temp; } else { free(temp); goto poczatek; } return tablica; //zwracam wskaznik do realokowanej tablicy } void zapiszobraz(struct obraz* tablica, int *aktobraz) { int i, j; FILE *plik; char nazwa[50]; printf("nPodaj nazwe pliku do zapisu (razem z typem np. nazwa.pgm):n"); //pobieram nazwe pliku do zapisu scanf("%s", nazwa); plik = fopen(nazwa, "w"); fprintf(plik, "P%cn", tablica[*aktobraz].standard); fprintf(plik, "%d %dn", tablica[*aktobraz].wys, tablica[*aktobraz].szer); //zapisuje parametry obrazu do pliku fprintf(plik, "%dn", tablica[*aktobraz].skal_szar); for (i = 0; i