Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdlib.h>
- #include <math.h>
- #include <stdio.h>
- #include <locale.h>
- int odczyt_pliku(struct obraz* hp1);
- int zapis_pliku(struct obraz hp1);
- void zapis_histogram(int* ile, struct obraz hp1);
- void zwalnianie_pamieci(struct obraz* hp1);
- void zwalnianie_blad(struct obraz* hp1, int ile);
- int obrot(struct obraz* hp1);
- void histogram(struct obraz* hp1, int* ile);
- void negatyw(struct obraz* hp1);
- void pieprz_sol(struct obraz* hp1);
- int filtr(struct obraz* hp1);
- void progowanie(struct obraz* hp1);
- struct obraz kopia_zapasowa(struct obraz* hp1);
- struct obraz
- {
- char* nazwa_pliku;
- char* standard;
- int szerokosc;
- int wysokosc;
- int zakres;
- int** piksele; //tablica na piksele
- };
- int main()
- {
- int x;
- int k = 0;
- int* ile;
- int wybor = 0;//tablica była
- int wybor1 = 0;
- struct obraz* hp1;
- struct obraz kopia_robocza;
- hp1 = (struct obraz*)malloc(1 * sizeof(struct obraz));
- srand(time(NULL));
- do
- {
- puts("Menu");
- puts("1.Odczyt");
- puts("2.Wyjscie");
- wybor = getch();
- system("cls");
- switch (wybor)
- {
- case ('1'):
- x = odczyt_pliku(hp1);// odczyt z pliku
- if (x == 0)
- break;
- if (x == 1)//ogarnac czyszczenie pamieci
- {
- kopia_robocza = kopia_zapasowa(hp1);
- do {
- puts("Mozliwe operacje na odczytanym obrazie:");
- puts("1.Obrot");
- puts("2.Progowanie");
- puts("3.Negatyw");
- puts("4.Pieprz i sol");
- puts("5.Filtr");
- puts("6.Zapis");
- puts("7.Cofnij");
- wybor1 = getch();
- //system("cls");
- switch (wybor1)
- {
- case ('1'):
- puts("Podaj wielokrotnosc kata 90 stopni:");
- k = getch();
- for (int i = 0; i < k - 48; i++)
- {
- obrot(&kopia_robocza);
- }
- puts("Wykonano obrot");
- break;
- case ('2'):
- //ile = (int*)calloc(kopia_robocza.zakres+1 , sizeof(int));
- //histogram(&kopia_robocza, ile);
- //zapis_histogram(ile, *hp1);
- progowanie(&kopia_robocza);
- puts("wykonano progowanie");
- break;
- case ('3'):
- negatyw(&kopia_robocza);
- puts("wykonano negatyw");
- break;
- case ('4'):
- pieprz_sol(&kopia_robocza);
- puts("Przyprawy");
- break;
- case ('5'):
- filtr(&kopia_robocza);
- puts("przefiltrowano");
- break;
- case('6'):
- zapis_pliku(kopia_robocza);//zapis musi byc oddzielna funkcja, dodac petle do
- break;
- default:
- break;
- }
- system("PAUSE");
- system("cls");
- } while (wybor1 != '7');
- }
- else
- {
- printf("Problem z alokacja %d wiersza, zwalniam pamiec\n", x);
- zwalnianie_blad(hp1, x);
- exit(0);
- }
- break;
- case ('2'):
- exit(0);
- break;
- default:
- break;
- }
- } while (wybor != '2');
- return 0;
- }
- int odczyt_pliku(struct obraz* hp1)
- {
- FILE* plik;
- char komentarze;
- hp1->nazwa_pliku = (char*)malloc(100 * sizeof(char));//alokacja tablicy z nazwa
- printf("Podaj nazwe pliku:\n");
- scanf("%s", hp1->nazwa_pliku);//wczytanie nazyw obrazu
- plik = fopen(hp1->nazwa_pliku, "r");//otwarcie pliku o podanej nazwie
- if (plik == NULL)//czy plik sie otworzyl
- {
- perror("Error");//komunikat dlaczego blad
- return 0;
- }
- else
- puts("Znaleziono plik");
- fscanf(plik, "%c", &komentarze);
- while (komentarze == '#')//szukanie komentarzy
- {
- while (komentarze != '\n')//dopoki nie jest nowa linia
- {
- fscanf(plik, "%c", &komentarze);
- }
- fscanf(plik, "%c", &komentarze);//przeskok do nowej lini
- }
- fseek(plik, -1, SEEK_CUR); //przesuniecie znacznika pliku o jeden w tył
- fscanf(plik, "%s\n", &hp1->standard);//musi być na adres :)(hp1->wysokosc) * sizeof&(hp1->piksele)
- fscanf(plik, "%c", &komentarze);
- while (komentarze == '#')
- {
- while (komentarze != '\n')
- {
- fscanf(plik, "%c", &komentarze);
- }
- fscanf(plik, "%c", &komentarze);
- }
- fseek(plik, -1, SEEK_CUR);
- fscanf(plik, "%d", &hp1->szerokosc);
- fscanf(plik, "%c", &komentarze);
- while (komentarze == '#')
- {
- while (komentarze != '\n')
- {
- fscanf(plik, "%c", &komentarze);
- }
- fscanf(plik, "%c", &komentarze);
- }
- fseek(plik, -1, SEEK_CUR);
- fscanf(plik, "%d", &hp1->wysokosc);
- fscanf(plik, "%c", &komentarze);
- while (komentarze == '#')
- {
- while (komentarze != '\n')
- {
- fscanf(plik, "%c", &komentarze);
- }
- fscanf(plik, "%c", &komentarze);
- }
- fseek(plik, -1, SEEK_CUR);
- fscanf(plik, "%d", &hp1->zakres);
- //deklaracja pamieci na tablice 2 wymiary
- hp1->piksele = (int**)malloc(hp1->wysokosc * sizeof(int));//rzutowanie(int) pamieci po zwrocie malloca
- if (hp1->piksele != NULL)
- {
- for (int i = 0; i < (hp1->wysokosc); i++)
- {
- hp1->piksele[i] = (int*)malloc(hp1->szerokosc * sizeof(int));//alokacja tablicy na odpowiednin rozmiar
- if (hp1->piksele[i] == NULL)
- {
- return i;
- }
- }
- for (int i = 0; i < hp1->wysokosc; i++)//wpisanie wartosci z pliku
- {
- for (int j = 0; j < hp1->szerokosc; j++)
- {
- fscanf(plik, "%c", &komentarze);//czyta znak
- while (komentarze == '#')//jezeli komentarz
- {
- while (komentarze != '\n')//dopóki nie \n
- {
- fscanf(plik, "%c", &komentarze);
- }
- fscanf(plik, "%c", &komentarze);
- }
- fseek(plik, -1, SEEK_CUR);
- fscanf(plik, "%d", &hp1->piksele[i][j]);
- }
- }
- printf("standard:%s\n", &hp1->standard);
- }
- else
- {
- puts("problem z alokacja tablicy");
- fclose(plik);
- return 0;
- }
- fclose(plik);
- return 1;
- }
- int zapis_pliku(struct obraz hp1)
- {
- FILE* plik;
- char x = 0;
- hp1.nazwa_pliku = (char*)malloc(100 * sizeof(char));//alokacja tablicy z nazwa
- puts("Podaj nazwe pliku:");
- scanf("%s", hp1.nazwa_pliku);//wczytanie nazyw obrazu
- plik = fopen(hp1.nazwa_pliku, "w");//otwarcie pliku o podanej nazwie
- if (plik == NULL)//czy plik sie utworzyl
- {
- perror("Tablice.csv");//komunikat dlaczego blad
- return 0;
- }
- fprintf(plik, "%s\n", &hp1.standard);
- fprintf(plik, "%d %d\n", hp1.szerokosc, hp1.wysokosc);
- fprintf(plik, "%d\n", hp1.zakres);
- for (int i = 0; i < hp1.wysokosc; i++)//wpisanie wartosci z pliku
- {
- for (int j = 0; j < hp1.szerokosc; j++)
- {
- fprintf(plik, "%d ", hp1.piksele[i][j]);
- }
- fprintf(plik, "\n");
- }
- fclose(plik);
- puts("Utworzono plik");
- return 1;
- }
- void zwalnianie_pamieci(struct obraz* hp1)
- {
- for (int i = 0; i < (hp1->wysokosc); i++)
- {
- free((hp1->piksele[i]));
- }
- free((hp1->piksele));
- }
- void zwalnianie_blad(struct obraz* hp1, int ile)
- {
- for (int i = 0; i < ile; i++)
- {
- free((hp1->piksele[i]));
- }
- free((hp1->piksele));
- }
- struct obraz kopia_zapasowa(struct obraz* hp1)//kopia robocza aby mozna ten sam obraz przekształcać
- {
- int i, j;
- struct obraz kopia_robocza;
- kopia_robocza.zakres = hp1->zakres;
- kopia_robocza.szerokosc = hp1->szerokosc;
- kopia_robocza.wysokosc = hp1->wysokosc;
- kopia_robocza.standard = hp1->standard;
- kopia_robocza.nazwa_pliku = hp1->nazwa_pliku;
- kopia_robocza.piksele = (int**)malloc(hp1->wysokosc * sizeof(int));
- if (kopia_robocza.piksele != NULL)
- {
- for (i = 0; i < hp1->wysokosc; i++)
- {
- kopia_robocza.piksele[i] = (int*)malloc(hp1->szerokosc * sizeof(int));
- if (kopia_robocza.piksele == NULL)
- printf("BLAD!!!");
- }
- }
- else printf("BLAD!!!");
- for (i = 0; i < hp1->wysokosc; i++)
- {
- for (j = 0; j < hp1->szerokosc; j++)
- {
- kopia_robocza.piksele[i][j] = hp1->piksele[i][j];
- }
- }
- return kopia_robocza;
- }
- int obrot(struct obraz* hp1)
- {
- int i, j;
- struct obraz kopia_robocza;
- kopia_robocza = kopia_zapasowa(hp1);//co to robi?
- for (i = 0; i < hp1->wysokosc; i++)
- {
- free(hp1->piksele[i]);
- }
- free(hp1->piksele);
- hp1->szerokosc = kopia_robocza.wysokosc;
- hp1->wysokosc = kopia_robocza.szerokosc;
- hp1->piksele = (int**)malloc(hp1->wysokosc * sizeof(int));
- if (hp1->piksele != NULL)
- {
- for (i = 0; i < hp1->wysokosc; i++)
- {
- hp1->piksele[i] = (int*)malloc(hp1->szerokosc * sizeof(int));
- if (hp1->piksele == NULL)
- return 1;
- }
- }
- for (i = 0; i < hp1->wysokosc; i++)
- {
- for (j = 0; j < hp1->szerokosc; j++)
- {
- hp1->piksele[i][j] = kopia_robocza.piksele[j][kopia_robocza.szerokosc - i - 1];
- }
- }
- for (i = 0; i < kopia_robocza.wysokosc; i++)
- {
- free(kopia_robocza.piksele[i]);
- }
- free(kopia_robocza.piksele);
- return 0;
- }
- void histogram(struct obraz* hp1, int* ile)
- {
- int i, j;
- int max = 0;
- for (i = 0; i < hp1->wysokosc; i++)
- {
- for (j = 0; j < hp1->szerokosc; j++)
- {
- //ile[hp1->piksele[i][j]]++;//sumowanie
- ile[i]=ile[i] + hp1->piksele[i][j];
- }
- }
- for (i = 0; i < hp1->zakres; i++)
- {
- if (ile[i] > max)
- max = ile[i];
- }
- for (i = 0; i < hp1->zakres; i++)
- {
- ile[i] = ile[i] * hp1->wysokosc / max;
- }
- }
- void zapis_histogram(int *ile, struct obraz hp1)
- {
- FILE* plik;
- int i;
- plik = fopen("tablice.csv", "w");
- if (plik == NULL)//czy plik sie otworzyl
- {
- perror("Tablice.csv");//komunikat dlaczego blad
- }
- for (i = 0; i < hp1.wysokosc; i++)
- {
- fprintf(plik, "%d\n", *ile++);
- }
- fclose(plik);
- }
- void negatyw(struct obraz* hp1)
- {
- int i, j;
- for (i = 0; i < hp1->wysokosc; i++)
- {
- for (j = 0; j < hp1->szerokosc; j++)
- {
- hp1->piksele[i][j] = hp1->zakres - hp1->piksele[i][j];
- }
- }
- }
- void pieprz_sol(struct obraz* hp1)
- {
- int i, j;
- for (i = 0; i < hp1->wysokosc; i++)
- {
- for (j = 0; j < hp1->szerokosc; j++)
- {
- if (rand() % 11 < 1)
- {
- if (rand() % 2) hp1->piksele[i][j] = 0;
- else
- {
- hp1->piksele[i][j] = hp1->zakres;
- }
- }
- }
- }
- }
- int filtr(struct obraz* hp1)
- {
- int gauss[3][3] = {
- {1,2,1},
- {2,4,2},
- {1,2,1}
- };
- int i, j, k, l;
- int okno = 0;
- int suma = 16;
- struct obraz kopia_robocza;
- kopia_robocza = kopia_zapasowa(hp1);
- for (i = 0; i < hp1->wysokosc - 2; i++)
- {
- for (j = 0; j < hp1->szerokosc - 2; j++)
- {
- for (k = 0; k < 3; k++)
- {
- for (l = 0; l < 3; l++)
- {
- okno = okno + kopia_robocza.piksele[i + k][j + l] * gauss[k][l];
- }
- }
- hp1->piksele[i + 1][j + 1] = okno / suma;
- okno = 0;
- }
- }
- for (i = 0; i < kopia_robocza.wysokosc; i++)
- {
- free(kopia_robocza.piksele[i]);
- }
- free(kopia_robocza.piksele);
- return 0;
- }
- void progowanie(struct obraz* hp1)
- {
- int i, j, prog;
- puts("podaj wartosc progu");
- scanf("%d", &prog);
- for (i = 0; i < hp1->wysokosc; i++)
- {
- for (j = 0; j < hp1->szerokosc; j++)
- {
- if (hp1->piksele[i][j] < prog)
- hp1->piksele[i][j] = 0;
- else
- hp1->piksele[i][j] = hp1->zakres;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement