Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.23 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4.  
  5. #define MAX 512 /* Maksymalny rozmiar wczytywanego obrazu */
  6. #define DL_LINII 1024 /* Dlugosc buforow pomocniczych */
  7.  
  8. /************************************************************************************
  9. * Funkcja wczytuje obraz PGM z pliku do tablicy *
  10. * *
  11. * \param[in] plik_we uchwyt do pliku z obrazem w formacie PGM *
  12. * \param[out] obraz_pgm tablica, do ktorej zostanie zapisany obraz *
  13. * \param[out] wymx szerokosc obrazka *
  14. * \param[out] wymy wysokosc obrazka *
  15. * \param[out] szarosci liczba odcieni szarosci *
  16. * \return liczba wczytanych pikseli *
  17. ************************************************************************************/
  18.  
  19. int zapisz(FILE *plik_wy, int obraz_pgm[][MAX], int *wymx, int *wymy, int szarosci)
  20. {
  21. int i, j;
  22. fprintf(plik_wy,"P2\n"); /*wpisz numer magiczny*/
  23. fprintf(plik_wy,"%d %d %d\n",*wymx,*wymy,szarosci);
  24. for (i=0;i<*wymy;i++) /*oraz wszystko inne*/
  25. { /*jak w negatyw - po kolei dane z tablicy*/
  26. for (j=0;j<*wymx;j++)
  27. {
  28. fprintf(plik_wy,"%d ",obraz_pgm[i][j]);
  29. }
  30. fprintf(plik_wy,"\n ");
  31. }
  32. }
  33.  
  34.  
  35. int czytaj(FILE *plik_we,int obraz_pgm[][MAX],int *wymx,int *wymy, int *szarosci) {
  36. char buf[DL_LINII]; /* bufor pomocniczy do czytania naglowka i komentarzy */
  37. int znak; /* zmienna pomocnicza do czytania komentarzy */
  38. int koniec=0; /* czy napotkano koniec danych w pliku */
  39. int i,j;
  40.  
  41. /*Sprawdzenie czy podano prawid³owy uchwyt pliku */
  42. if (plik_we==NULL) {
  43. fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
  44. return(0);
  45. }
  46.  
  47. /* Sprawdzenie "numeru magicznego" - powinien byæ P2 */
  48. if (fgets(buf,DL_LINII,plik_we)==NULL) /* Wczytanie pierwszej linii pliku do bufora */
  49. koniec=1; /* Nie udalo sie? Koniec danych! */
  50.  
  51. if ( (buf[0]!='P') || (buf[1]!='2') || koniec) { /* Czy jest magiczne "P2"? */
  52. fprintf(stderr,"Blad: To nie jest plik PGM\n");
  53. return(0);
  54. }
  55.  
  56. /* Pominiecie komentarzy */
  57. do {
  58. if ((znak=fgetc(plik_we))=='#') { /* Czy linia rozpoczyna sie od znaku '#'? */
  59. if (fgets(buf,DL_LINII,plik_we)==NULL) /* Przeczytaj ja do bufora */
  60. koniec=1; /* Zapamietaj ewentualny koniec danych */
  61. } else {
  62. ungetc(znak,plik_we); /* Gdy przeczytany znak z poczatku linii */
  63. } /* nie jest '#' zwroc go */
  64. } while (znak=='#' && !koniec); /* Powtarzaj dopoki sa linie komentarza */
  65. /* i nie nastapil koniec danych */
  66.  
  67. /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
  68. if (fscanf(plik_we,"%d %d %d",wymx,wymy,szarosci)!=3) {
  69. fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
  70. return(0);
  71. }
  72. /* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
  73. for (i=0;i<*wymy;i++) {
  74. for (j=0;j<*wymx;j++) {
  75. if (fscanf(plik_we,"%d",&(obraz_pgm[i][j]))!=1) {
  76. fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
  77. return(0);
  78. }
  79. }
  80. }
  81. return *wymx**wymy; /* Czytanie zakonczone sukcesem */
  82. } /* Zwroc liczbe wczytanych pikseli */
  83.  
  84. void wyswietl(int obraz_pgm[MAX][MAX],int *wymx,int*wymy,int *szarosci) {
  85. char polecenie[DL_LINII];/* bufor pomocniczy do zestawienia polecenia */
  86. char nazwa[9]="tmp.pmg";
  87. FILE *plik;
  88. int i,j;
  89.  
  90. plik=fopen(nazwa,"w");/*otworzenie pliku*/
  91. /*Zapis poszczegolnych elementow obrazu PGM do pliku tmp.pgm*/
  92. fprintf(plik,"P2\n"); /*wpisz numer magiczny*/
  93. fprintf(plik,"%d %d %d\n",*wymx,*wymy,*szarosci);
  94. for (i=0;i<*wymy;i++) /*oraz wszystko inne*/
  95. { /*jak w negatyw - po kolei dane z tablicy*/
  96. for (j=0;j<*wymx;j++)
  97. {
  98. fprintf(plik,"%d ",obraz_pgm[i][j]);
  99. }
  100. fprintf(plik,"\n ");
  101. }
  102. fclose(plik); /*zamkniecie pliku*/
  103.  
  104. strcpy(polecenie,"display "); /* konstrukcja polecenia postaci */
  105. strcat(polecenie,nazwa); /* display "nazwa_pliku" & */
  106. strcat(polecenie," &");
  107. printf("%s\n",polecenie); /* wydruk kontrolny polecenia */
  108. system(polecenie); /* wykonanie polecenia */
  109. }
  110.  
  111. void negatyw (int obrazek[][MAX], int *wymx,int *wymy, int szarosci)
  112. {
  113. int i,j;
  114. for (i=0; i<*wymy;++i) /*dla kazdej kolumny*/
  115. { /*a w kazdej dla wierszy*/
  116. for (j=0; j<*wymx;++j) obrazek[i][j]=szarosci-obrazek[i][j];
  117. } /*odejmij wartosc od szarosci*/
  118. }
  119.  
  120. void konturowanie(int obraz[][MAX], int *wymx, int*wymy,int szarosci)
  121. {
  122. int i,j;
  123.  
  124. for(i=0;i<*wymy;++i)
  125. {
  126. for(j=0;j<*wymx;++j)
  127. {
  128. obraz[i][j]=abs(obraz[i+1][j]-obraz[i][j])+abs(obraz[i][j+1]-obraz[i][j]);
  129. }
  130. }
  131. }
  132.  
  133. void progowanie (int obrazek[][MAX], int *wymx,int *wymy, int szarosci, int prog)
  134. {
  135. int i,j;
  136. for (i=0; i<*wymy;++i) /*dla kazdej kolumny*/
  137. { /*a w kazdej dla wierszy*/
  138. for (j=0; j<*wymx;++j)
  139. {
  140. if (obrazek[i][j]<=(szarosci*prog/100)) obrazek[i][j]=0;
  141. else obrazek[i][j]=szarosci;
  142. }
  143. } /*odejmij wartosc od szarosci*/
  144. }
  145.  
  146. void zmiana_poziomow (int obraz[][MAX], int *wymx, int *wymy, int szarosci, int poziom_czerni)
  147. {
  148. int i,j;
  149. for(i=0;i<*wymy;i++){
  150. for(j=0;j<*wymx;j++){
  151. if(obraz[i][j]<=(szarosci*poziom_czerni)/100)
  152. {
  153. obraz[i][j]=0;
  154. }
  155. if(((szarosci*poziom_czerni)/100)<obraz[i][j]<(((szarosci*(100-poziom_czerni))/100)))
  156. {
  157. (obraz[i][j]-((szarosci*poziom_czerni)/100))*(szarosci/((szarosci*(100-poziom_czerni)/100)-((szarosci*poziom_czerni)/100)));
  158. }
  159. if(obraz[i][j]>=(((szarosci*(100-poziom_czerni))/100)))
  160. {
  161. obraz[i][j]=szarosci;
  162. }
  163. }
  164.  
  165. }
  166. }
  167.  
  168. void rozmycie_pionowe(int obraz[][MAX], int *wymx, int *wymy, int szarosci, int promien){
  169. int i,j;
  170. for(i=0;i<*wymy;i++){
  171. for(j=0;j<*wymx;j++){
  172. obraz[i][j]=(obraz[i][j-promien]+obraz[i][j]+obraz[i][j+promien])/3;
  173. }
  174. }
  175. }
  176.  
  177.  
  178.  
  179. void menu(){
  180. printf("1.Wczytaj obraz\n");
  181. printf("2.Zapisz obraz\n");
  182. printf("3.Negatyw\n");
  183. printf("4.Progowanie\n");
  184. printf("5.Rozmycie pionowe\n");
  185. printf("6.Konturowanie\n");
  186. printf("7.Zmiana poziomow\n");
  187. printf("8.Wyswietl\n");
  188. printf("9.Wyjscie\n");
  189. printf("Twoj wybor: ");
  190. }
  191.  
  192.  
  193.  
  194.  
  195.  
  196. int main(){
  197. int obraz[MAX][MAX];
  198. int wymx,wymy,odcieni,prog,promien,poziom_czerni;
  199. int wybor;
  200. int odczytano=0;
  201. FILE *plik;
  202. char nazwa[100];
  203. char *nazwapliku;
  204.  
  205. menu();
  206. scanf("%d",&wybor);
  207. while(wybor!=9){
  208. switch(wybor){
  209. case 1:/*WCZYTYWANIE*/
  210. printf("Podaj nazwe pliku: ");
  211. scanf("%s",nazwa);
  212. plik=fopen(nazwa,"r"); /*otwórz plik w trybie czytania*/
  213. if (plik!=NULL) odczytano=czytaj(plik,obraz,&wymx,&wymy,&odcieni);
  214. fclose(plik);
  215. printf("Wczytano\n");
  216. menu();
  217. scanf("%d",&wybor);
  218. break;
  219. case 2:/*ZAPISYWANIE*/
  220. if(odczytano!=0){
  221. printf("Podaj nazwe pliku wyjściowego: ");
  222. scanf("%s",nazwa);
  223. plik=fopen(nazwa,"w");/*otwórz w trybie pisania*/
  224. zapisz(plik,obraz,&wymx,&wymy,odcieni);
  225. fclose(plik);
  226. printf("Zapisano\n");
  227. }
  228. else
  229. printf("Nie ma co zapisywac!\n");
  230. menu();
  231. scanf("%d",&wybor);
  232. break;
  233. case 3:/*NEGATYW*/
  234. if(odczytano!=0){
  235. negatyw(obraz,&wymx,&wymy,odcieni);
  236. printf("udalo sie!\n");
  237. }
  238. else printf("Nie wczytano pliku\n");
  239. menu();
  240. scanf("%d",&wybor);
  241. break;
  242. case 4:/*PROGOWANIE*/
  243. if(odczytano!=0){
  244. printf("Podaj prog w postaci liczby calkowitej(od 0 do 100): ");
  245. scanf("%d",&prog);
  246. progowanie(obraz,&wymx,&wymy,odcieni,prog);
  247. printf("Progowanie powiodlo sie\n");
  248. }
  249. else printf("Nie udalo sie\n");
  250. menu();
  251. scanf("%d",&wybor);
  252. break;
  253. case 5:/*ROZMYCIE PIONOWE*/
  254. if(odczytano!=0){
  255. printf("Podaj promien rozmycia: ");
  256. scanf("%d",&promien);
  257. rozmycie_pionowe(obraz,&wymx,&wymy,odcieni,promien);
  258. printf("Rozmycie pionowe powiodlo sie!\n");
  259. }
  260. else printf("Nie udalo sie\n");
  261. menu();
  262. scanf("%d",&wybor);
  263. break;
  264. case 6:/*Konturowanie*/
  265. if(odczytano!=0){
  266. konturowanie(obraz,&wymx,&wymy,odcieni);
  267. printf("Konturowanie powiodlo sie!\n");}
  268. else printf("Nie udalo sie\n");
  269. menu();
  270. scanf("%d",&wybor);
  271. break;
  272. case 7:/*ZMIANA POZIOMOW*/
  273. if(odczytano!=0){
  274. printf("Podaj poziom czerni: ");
  275. scanf("%d",&poziom_czerni);
  276. zmiana_poziomow(obraz,&wymx,&wymy,odcieni,poziom_czerni);
  277. printf("Zmiana poziomow powiodla sie!\n");
  278. }
  279. else printf("Nie udalo sie\n");
  280. menu();
  281. scanf("%d",&wybor);
  282. break;
  283. case 8:/*WYSWIETL*/
  284. if(odczytano!=0)
  285. wyswietl(obraz,&wymx,&wymy,&odcieni);
  286. else
  287. printf("Nie ma co wyswietlac\n");
  288. menu();
  289. scanf("%d",&wybor);
  290. break;
  291. case 9:/*KONIEC PROGRAMU*/
  292. printf("Koniec dzialania programu\n");
  293. break;
  294. }
  295. }
  296.  
  297. return 0;
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement