Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #define MAX 512 /* Maksymalny rozmiar wczytywanego obrazu */
- #define DL_LINII 1024 /* Dlugosc buforow pomocniczych */
- /************************************************************************************
- * Funkcja wczytuje obraz PGM z pliku do tablicy *
- * *
- * \param[in] plik_we uchwyt do pliku z obrazem w formacie PGM *
- * \param[out] obraz_pgm tablica, do ktorej zostanie zapisany obraz *
- * \param[out] wymx szerokosc obrazka *
- * \param[out] wymy wysokosc obrazka *
- * \param[out] szarosci liczba odcieni szarosci *
- * \return liczba wczytanych pikseli *
- ************************************************************************************/
- int zapisz(FILE *plik_wy, int obraz_pgm[][MAX], int *wymx, int *wymy, int szarosci)
- {
- int i, j;
- fprintf(plik_wy,"P2\n"); /*wpisz numer magiczny*/
- fprintf(plik_wy,"%d %d %d\n",*wymx,*wymy,szarosci);
- for (i=0;i<*wymy;i++) /*oraz wszystko inne*/
- { /*jak w negatyw - po kolei dane z tablicy*/
- for (j=0;j<*wymx;j++)
- {
- fprintf(plik_wy,"%d ",obraz_pgm[i][j]);
- }
- fprintf(plik_wy,"\n ");
- }
- }
- int czytaj(FILE *plik_we,int obraz_pgm[][MAX],int *wymx,int *wymy, int *szarosci) {
- char buf[DL_LINII]; /* bufor pomocniczy do czytania naglowka i komentarzy */
- int znak; /* zmienna pomocnicza do czytania komentarzy */
- int koniec=0; /* czy napotkano koniec danych w pliku */
- int i,j;
- /*Sprawdzenie czy podano prawid³owy uchwyt pliku */
- if (plik_we==NULL) {
- fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
- return(0);
- }
- /* Sprawdzenie "numeru magicznego" - powinien byæ P2 */
- if (fgets(buf,DL_LINII,plik_we)==NULL) /* Wczytanie pierwszej linii pliku do bufora */
- koniec=1; /* Nie udalo sie? Koniec danych! */
- if ( (buf[0]!='P') || (buf[1]!='2') || koniec) { /* Czy jest magiczne "P2"? */
- fprintf(stderr,"Blad: To nie jest plik PGM\n");
- return(0);
- }
- /* Pominiecie komentarzy */
- do {
- if ((znak=fgetc(plik_we))=='#') { /* Czy linia rozpoczyna sie od znaku '#'? */
- if (fgets(buf,DL_LINII,plik_we)==NULL) /* Przeczytaj ja do bufora */
- koniec=1; /* Zapamietaj ewentualny koniec danych */
- } else {
- ungetc(znak,plik_we); /* Gdy przeczytany znak z poczatku linii */
- } /* nie jest '#' zwroc go */
- } while (znak=='#' && !koniec); /* Powtarzaj dopoki sa linie komentarza */
- /* i nie nastapil koniec danych */
- /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
- if (fscanf(plik_we,"%d %d %d",wymx,wymy,szarosci)!=3) {
- fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
- return(0);
- }
- /* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
- for (i=0;i<*wymy;i++) {
- for (j=0;j<*wymx;j++) {
- if (fscanf(plik_we,"%d",&(obraz_pgm[i][j]))!=1) {
- fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
- return(0);
- }
- }
- }
- return *wymx**wymy; /* Czytanie zakonczone sukcesem */
- } /* Zwroc liczbe wczytanych pikseli */
- void wyswietl(int obraz_pgm[MAX][MAX],int *wymx,int*wymy,int *szarosci) {
- char polecenie[DL_LINII];/* bufor pomocniczy do zestawienia polecenia */
- char nazwa[9]="tmp.pmg";
- FILE *plik;
- int i,j;
- plik=fopen(nazwa,"w");/*otworzenie pliku*/
- /*Zapis poszczegolnych elementow obrazu PGM do pliku tmp.pgm*/
- fprintf(plik,"P2\n"); /*wpisz numer magiczny*/
- fprintf(plik,"%d %d %d\n",*wymx,*wymy,*szarosci);
- for (i=0;i<*wymy;i++) /*oraz wszystko inne*/
- { /*jak w negatyw - po kolei dane z tablicy*/
- for (j=0;j<*wymx;j++)
- {
- fprintf(plik,"%d ",obraz_pgm[i][j]);
- }
- fprintf(plik,"\n ");
- }
- fclose(plik); /*zamkniecie pliku*/
- strcpy(polecenie,"display "); /* konstrukcja polecenia postaci */
- strcat(polecenie,nazwa); /* display "nazwa_pliku" & */
- strcat(polecenie," &");
- printf("%s\n",polecenie); /* wydruk kontrolny polecenia */
- system(polecenie); /* wykonanie polecenia */
- }
- void negatyw (int obrazek[][MAX], int *wymx,int *wymy, int szarosci)
- {
- int i,j;
- for (i=0; i<*wymy;++i) /*dla kazdej kolumny*/
- { /*a w kazdej dla wierszy*/
- for (j=0; j<*wymx;++j) obrazek[i][j]=szarosci-obrazek[i][j];
- } /*odejmij wartosc od szarosci*/
- }
- void konturowanie(int obraz[][MAX], int *wymx, int*wymy,int szarosci)
- {
- int i,j;
- for(i=0;i<*wymy;++i)
- {
- for(j=0;j<*wymx;++j)
- {
- obraz[i][j]=abs(obraz[i+1][j]-obraz[i][j])+abs(obraz[i][j+1]-obraz[i][j]);
- }
- }
- }
- void progowanie (int obrazek[][MAX], int *wymx,int *wymy, int szarosci, int prog)
- {
- int i,j;
- for (i=0; i<*wymy;++i) /*dla kazdej kolumny*/
- { /*a w kazdej dla wierszy*/
- for (j=0; j<*wymx;++j)
- {
- if (obrazek[i][j]<=(szarosci*prog/100)) obrazek[i][j]=0;
- else obrazek[i][j]=szarosci;
- }
- } /*odejmij wartosc od szarosci*/
- }
- void zmiana_poziomow (int obraz[][MAX], int *wymx, int *wymy, int szarosci, int poziom_czerni)
- {
- int i,j;
- for(i=0;i<*wymy;i++){
- for(j=0;j<*wymx;j++){
- if(obraz[i][j]<=(szarosci*poziom_czerni)/100)
- {
- obraz[i][j]=0;
- }
- if(((szarosci*poziom_czerni)/100)<obraz[i][j]<(((szarosci*(100-poziom_czerni))/100)))
- {
- (obraz[i][j]-((szarosci*poziom_czerni)/100))*(szarosci/((szarosci*(100-poziom_czerni)/100)-((szarosci*poziom_czerni)/100)));
- }
- if(obraz[i][j]>=(((szarosci*(100-poziom_czerni))/100)))
- {
- obraz[i][j]=szarosci;
- }
- }
- }
- }
- void rozmycie_pionowe(int obraz[][MAX], int *wymx, int *wymy, int szarosci, int promien){
- int i,j;
- for(i=0;i<*wymy;i++){
- for(j=0;j<*wymx;j++){
- obraz[i][j]=(obraz[i][j-promien]+obraz[i][j]+obraz[i][j+promien])/3;
- }
- }
- }
- void menu(){
- printf("1.Wczytaj obraz\n");
- printf("2.Zapisz obraz\n");
- printf("3.Negatyw\n");
- printf("4.Progowanie\n");
- printf("5.Rozmycie pionowe\n");
- printf("6.Konturowanie\n");
- printf("7.Zmiana poziomow\n");
- printf("8.Wyswietl\n");
- printf("9.Wyjscie\n");
- printf("Twoj wybor: ");
- }
- int main(){
- int obraz[MAX][MAX];
- int wymx,wymy,odcieni,prog,promien,poziom_czerni;
- int wybor;
- int odczytano=0;
- FILE *plik;
- char nazwa[100];
- char *nazwapliku;
- menu();
- scanf("%d",&wybor);
- while(wybor!=9){
- switch(wybor){
- case 1:/*WCZYTYWANIE*/
- printf("Podaj nazwe pliku: ");
- scanf("%s",nazwa);
- plik=fopen(nazwa,"r"); /*otwórz plik w trybie czytania*/
- if (plik!=NULL) odczytano=czytaj(plik,obraz,&wymx,&wymy,&odcieni);
- fclose(plik);
- printf("Wczytano\n");
- menu();
- scanf("%d",&wybor);
- break;
- case 2:/*ZAPISYWANIE*/
- if(odczytano!=0){
- printf("Podaj nazwe pliku wyjściowego: ");
- scanf("%s",nazwa);
- plik=fopen(nazwa,"w");/*otwórz w trybie pisania*/
- zapisz(plik,obraz,&wymx,&wymy,odcieni);
- fclose(plik);
- printf("Zapisano\n");
- }
- else
- printf("Nie ma co zapisywac!\n");
- menu();
- scanf("%d",&wybor);
- break;
- case 3:/*NEGATYW*/
- if(odczytano!=0){
- negatyw(obraz,&wymx,&wymy,odcieni);
- printf("udalo sie!\n");
- }
- else printf("Nie wczytano pliku\n");
- menu();
- scanf("%d",&wybor);
- break;
- case 4:/*PROGOWANIE*/
- if(odczytano!=0){
- printf("Podaj prog w postaci liczby calkowitej(od 0 do 100): ");
- scanf("%d",&prog);
- progowanie(obraz,&wymx,&wymy,odcieni,prog);
- printf("Progowanie powiodlo sie\n");
- }
- else printf("Nie udalo sie\n");
- menu();
- scanf("%d",&wybor);
- break;
- case 5:/*ROZMYCIE PIONOWE*/
- if(odczytano!=0){
- printf("Podaj promien rozmycia: ");
- scanf("%d",&promien);
- rozmycie_pionowe(obraz,&wymx,&wymy,odcieni,promien);
- printf("Rozmycie pionowe powiodlo sie!\n");
- }
- else printf("Nie udalo sie\n");
- menu();
- scanf("%d",&wybor);
- break;
- case 6:/*Konturowanie*/
- if(odczytano!=0){
- konturowanie(obraz,&wymx,&wymy,odcieni);
- printf("Konturowanie powiodlo sie!\n");}
- else printf("Nie udalo sie\n");
- menu();
- scanf("%d",&wybor);
- break;
- case 7:/*ZMIANA POZIOMOW*/
- if(odczytano!=0){
- printf("Podaj poziom czerni: ");
- scanf("%d",&poziom_czerni);
- zmiana_poziomow(obraz,&wymx,&wymy,odcieni,poziom_czerni);
- printf("Zmiana poziomow powiodla sie!\n");
- }
- else printf("Nie udalo sie\n");
- menu();
- scanf("%d",&wybor);
- break;
- case 8:/*WYSWIETL*/
- if(odczytano!=0)
- wyswietl(obraz,&wymx,&wymy,&odcieni);
- else
- printf("Nie ma co wyswietlac\n");
- menu();
- scanf("%d",&wybor);
- break;
- case 9:/*KONIEC PROGRAMU*/
- printf("Koniec dzialania programu\n");
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement