Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.52 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include <stdlib.h>
  7. #include <limits.h>
  8.  
  9. #define MAXSTRLEN 100
  10. #define DEKLARACJATABLICY tab = malloc(dlugosc_tablicy * sizeof(*tab));
  11. #define SPRAWDZTABLICE if (!ptr) {printf("\nBlad przy przydzielaniu pamieci.\n"); return -1;};
  12. #define WYBOBR (tablicaObrazow + wybranyObraz)
  13.  
  14. struct obraz {
  15. char nazwa[MAXSTRLEN];
  16. int szerokosc;
  17. int wysokosc;
  18. int maksWartoscSzarosci;
  19. int standard; //2 to P2 (ASCII), 5 to P5 (binary)
  20.  
  21. int* tablicaPikseli;
  22. char** komentarze;
  23. int indeksKomentarza;
  24. }; typedef struct obraz obraz;
  25.  
  26. int WczytajLiczbe(FILE* plik);
  27. int CzytajPlik(FILE* plik, obraz* wczytObraz, obraz** tabObrazow, int* dlugoscTablicyObrazow);
  28. int WczytajPlik(obraz* wczytObraz, obraz** tabObrazow, int* dlugoscTablicyObrazow);
  29. int WczytajKonsola(char komunikat[], int granica_dolna, int granica_gorna, int* kontrolka);
  30. int UsunObraz(obraz** tabObr, int* tabObrLen, int indeksObr);
  31. int ZapiszPlik(obraz* zapObraz, char nazwaPliku[]);
  32. void Transpozycja(obraz* obrazTransponowany, int liczba_obrotow);
  33. int Szum(obraz* obrazSzumiony, int procent_szumu);
  34. int* Histogram(obraz* Obraz);
  35. int FiltrGaussa(obraz* Obraz);
  36. int Progowanie(obraz* Obraz, int* histogram);
  37.  
  38. int main(int argc, char* argv[]) {
  39. char nazwa[MAXSTRLEN];
  40. int krok_programu = 0;
  41. int wyswietl = 0;
  42. int wybranyObraz = 0;
  43. int k = 0;
  44. int srodekHist = 0;
  45. int krok_obrobki = 0;
  46. int* histogram = { 1 };
  47. obraz NowyObraz;
  48. obraz* tablicaObrazow = malloc(2 * sizeof(obraz));
  49. int dlugoscTablicyObrazow = 0;
  50.  
  51. while (1)
  52. {
  53. switch (krok_programu)
  54. {
  55. case 0:
  56.  
  57. printf("Podaj nazwe pliku ktory chcesz otworzyc lub wpisz:\
  58. \n\r'clr' zeby wyczyscic ekran\n\
  59. \n\r'sel' zeby wybrac obraz\n\
  60. \n\r'mod' zeby rozpoczac obrobke wybranego obrazu\n\
  61. \n\r'del' zeby usunac wybrany obraz\n\
  62. \n\r'sv' zeby zapisac wybrany obraz\n\
  63. \n\r'exit' zeby wyjsc\n");
  64.  
  65. while (!scanf("%s", nazwa))
  66. {
  67. char c;
  68. while (c = getchar() != '\n');
  69. }
  70. if (!strcmp(nazwa, "exit")) {
  71. krok_programu = 100;
  72. continue;
  73. }
  74. else if (!strcmp(nazwa, "clr")) {
  75. system("cls");
  76. continue;
  77. }
  78. else if (!strcmp(nazwa, "mod")) {
  79. krok_programu = 5;
  80. }
  81. else if (!strcmp(nazwa, "sel")) {
  82. krok_programu = 3;
  83. }
  84. else if (!strcmp(nazwa, "del")) {
  85. krok_programu = 6;
  86. }
  87. else if (!strcmp(nazwa, "sv")) {
  88. krok_programu = 7;
  89. }
  90.  
  91. if (krok_programu != 0)
  92. {
  93. if (!dlugoscTablicyObrazow) {
  94. printf("\nZeby wybrac ta funkcje musisz wczytac obraz.\n");
  95. krok_programu = 0;
  96. continue;
  97. }
  98. else
  99. {
  100. continue;
  101. }
  102. }
  103. krok_programu = 1;
  104. break;
  105.  
  106. case 1:
  107. printf("Wczytuje plik %s\n", nazwa);
  108. strcpy(NowyObraz.nazwa, nazwa);
  109. if (WczytajPlik(&NowyObraz, &tablicaObrazow, &dlugoscTablicyObrazow)) // 2 jezeli wyrzuci NULL -1 jezeli blad przy odczycie 0 jezeli poprawnie wczytany
  110. {
  111. krok_programu = 0;
  112. continue;
  113. }
  114.  
  115. wybranyObraz = dlugoscTablicyObrazow - 1;
  116. krok_programu = 0;
  117. break;
  118. case 3:
  119. printf("\nObrazy: ");
  120. for (int i = 0; i < dlugoscTablicyObrazow; i++)
  121. {
  122. printf("%d - \"%s\", ", i, (tablicaObrazow + i)->nazwa);
  123. }
  124. printf("\n");
  125. if (WczytajKonsola("\rWybierz indeks obrazu ktory chcesz wybrac\n", 0, dlugoscTablicyObrazow - 1, &wybranyObraz))
  126. {
  127. wybranyObraz = 0;
  128. printf("Wybrano obraz \"%s\"\n", WYBOBR->nazwa);
  129. krok_programu = 0;
  130. break;
  131. }
  132. srodekHist = 0;
  133. printf("Wybrano obraz \"%s\"\n", WYBOBR->nazwa);
  134. krok_programu = 0;
  135. break;
  136.  
  137. case 5:
  138.  
  139. system("cls");
  140. if (WczytajKonsola("\rWybierz, co chcesz zrobic z obrazem\
  141. \n\r'0' - obrot w lewo\n\
  142. \n\r'1' - obrot w prawo\n\
  143. \n\r'2' - obrot w lewo o k * 90 stopni\n\
  144. \n\r'3' - dodaj szum 'sol i pieprz'\n\
  145. \n\r'4' - zastosuj filtr Gaussa\n\
  146. \n\r'5' - stworz histogram i zapisz do pliku csv\n\
  147. \n\r'6' - progowanie obrazu (na podstawie histogramu)\n\
  148. ", 0, 6, &krok_obrobki))
  149. {
  150. krok_programu = 0;
  151. continue;
  152. }
  153.  
  154. switch (krok_obrobki) {
  155. case 0:
  156. printf("Obracam obraz w lewo...\n");
  157. Transpozycja(WYBOBR, 1);
  158. break;
  159. case 1:
  160. printf("Obracam obraz w prawo...\n");
  161. Transpozycja(WYBOBR, 3);
  162. break;
  163. case 2:
  164.  
  165. if (WczytajKonsola("\rPodaj liczba obrotow (k)\n", 1, 4, &k))
  166. {
  167. continue;
  168. }
  169. printf("Obracam obraz w lewo o k * 90 stopni...\n");
  170. Transpozycja(WYBOBR, k);
  171. break;
  172. case 3:
  173. if (WczytajKonsola("\rPodaj procentowa szanse na zaszumienie piksela\n", 1, 100, &k))
  174. {
  175. continue;
  176. }
  177. printf("Zaszumiam obraz...\n");
  178. Szum(WYBOBR, k);
  179. break;
  180. case 4:
  181. if (WczytajKonsola("\rWybierz filtr\n 0 - Dolnoprzepustowy ('rozmazujacy')\n 1 - Gornoprzepustowy ('Wyostrzajacy')\n 2 - bardziej Gornoprzepustowy\n", 0, 2, &k))
  182. {
  183. continue;
  184. }
  185. printf("Filtruje...\n");
  186. FiltrGaussa(WYBOBR, k);
  187. break;
  188. case 5:
  189. printf("Tworze histogram...\n");
  190. srodekHist = 1;
  191. histogram = Histogram(WYBOBR);
  192. break;
  193. case 6:
  194. if (!srodekHist) {
  195. printf("Najpierw trzeba stworzyc histogram!\n");
  196. continue;
  197. }
  198.  
  199. printf("Proguje obraz...\n");
  200. Progowanie(WYBOBR, histogram);
  201. default:
  202. break;
  203. }
  204.  
  205. break;
  206. case 6:
  207. printf("Usuwam obraz \"%s\"...\n", WYBOBR->nazwa);
  208. UsunObraz(&tablicaObrazow, &dlugoscTablicyObrazow, wybranyObraz);
  209. srodekHist = 0;
  210. if (dlugoscTablicyObrazow)
  211. {
  212. krok_programu = 3;
  213. }
  214. else {
  215. krok_programu = 0;
  216. wybranyObraz = 0;
  217. }
  218. break;
  219. case 7:
  220.  
  221. printf("Podaj nazwe pod ktora chcesz zapisac plik (bez .pgm)\n");
  222. while (!scanf("%s", nazwa))
  223. {
  224. char c;
  225. while (c = getchar() != '\n');
  226. }
  227.  
  228. strcat(nazwa, ".pgm");
  229. printf("Zapisuje plik pod nazwa %s\n", nazwa);
  230. ZapiszPlik(WYBOBR, nazwa);
  231. krok_programu = 0;
  232. break;
  233.  
  234. case 100:
  235. for (int i = 0; i < dlugoscTablicyObrazow; i++) {
  236. for (int j = 0; j < tablicaObrazow[i].indeksKomentarza; j++)
  237. {
  238. free(tablicaObrazow[i].komentarze[j]);
  239. }
  240. free(tablicaObrazow[i].komentarze);
  241. free(tablicaObrazow[i].tablicaPikseli);
  242. }
  243. free(tablicaObrazow);
  244. return 0;
  245. default:
  246. krok_programu = 0;
  247. continue;
  248. }
  249. }
  250. }
  251.  
  252. int Progowanie(obraz* Obraz, int* histogram) {
  253. int* tab;
  254. int dlugosc_tablicy = Obraz->wysokosc * Obraz->szerokosc;
  255. int prog = 0;
  256. int t = Obraz->maksWartoscSzarosci / 2;
  257. int tcz = 0;
  258. int tb = 0;
  259. int tstare = 0;
  260. int sumaPikseli = 0;
  261. int suma = 0;
  262.  
  263. DEKLARACJATABLICY
  264. int* ptr = tab;
  265.  
  266. SPRAWDZTABLICE
  267.  
  268. do
  269. {
  270. for (int i = 0; i < t; i++)
  271. {
  272. sumaPikseli += histogram[i];
  273. suma += histogram[i] * i;
  274. }
  275. tcz = suma / sumaPikseli;
  276. for (int i = t; i < (Obraz->maksWartoscSzarosci + 1); i++)
  277. {
  278. sumaPikseli += histogram[i];
  279. suma += histogram[i] * i;
  280. }
  281. tb = suma / sumaPikseli;
  282. tstare = t;
  283. t = (tcz + tb) / 2;
  284. } while (t != tstare);
  285.  
  286. prog = t;
  287. printf("Prog wynosi: %d \n", prog);
  288.  
  289. for (int i = 0; i < Obraz->wysokosc; i++)
  290. {
  291. for (int j = 0; j < Obraz->szerokosc; j++)
  292. {
  293. tab[i * Obraz->szerokosc + j] = Obraz->tablicaPikseli[i * Obraz->szerokosc + j] < prog ? 0 : Obraz->maksWartoscSzarosci;
  294. }
  295. }
  296.  
  297. free(Obraz->tablicaPikseli);
  298. Obraz->tablicaPikseli = tab;
  299.  
  300. return 0;
  301. }
  302.  
  303. int FiltrGaussa(obraz* Obraz, int wybrana_maska) {
  304. int* tab;
  305. int dlugosc_tablicy = Obraz->wysokosc * Obraz->szerokosc;
  306. int szerokosc_okna = 3;
  307. int maska[3][3][3] = {
  308. { {-1,-1,-1}, {-1,14,-1}, {-1,-1,-1} },
  309. { {0,-1,0}, {-1,5,-1}, {0,-1,0} },
  310. { {1,2,1}, {2,4,2}, {1,2,1} }
  311. };
  312.  
  313. DEKLARACJATABLICY
  314. int* ptr = tab;
  315.  
  316. SPRAWDZTABLICE
  317.  
  318. int sumaWag = 0;
  319.  
  320. for (int i = 0; i < 3; i++)
  321. {
  322.  
  323. for (int j = 0; j < 3; j++)
  324. {
  325. sumaWag += maska[wybrana_maska][i][j];
  326. }
  327. }
  328.  
  329. int offset = szerokosc_okna / 2;
  330. for (int i = offset; i < Obraz->wysokosc - offset; i++)
  331. {
  332. for (int j = offset; j < Obraz->szerokosc - offset; j++)
  333. {
  334. int suma = 0;
  335. for (int k = 0; k < 3; k++)
  336. {
  337. for (int l = 0; l < 3; l++)
  338. {
  339. suma += maska[wybrana_maska][k][l] * Obraz->tablicaPikseli[(i + k - 1) * Obraz->szerokosc + j + l - 1];
  340. }
  341. }
  342. tab[i * Obraz->szerokosc + j] = suma / sumaWag < 0 ? 0 : suma / sumaWag > Obraz->maksWartoscSzarosci ? Obraz->maksWartoscSzarosci : suma / sumaWag;
  343. }
  344. }
  345. for (int j = 0; j < Obraz->szerokosc; j++) {
  346. tab[j] = Obraz->tablicaPikseli[j];
  347. }
  348. for (int j = 0; j < Obraz->szerokosc; j++) {
  349. tab[Obraz->szerokosc * (Obraz->wysokosc - 1) + j] = Obraz->tablicaPikseli[Obraz->szerokosc * (Obraz->wysokosc - 1) + j];
  350. }
  351. for (int j = 0; j < Obraz->wysokosc; j++) {
  352. tab[j * Obraz->szerokosc] = Obraz->tablicaPikseli[j * Obraz->szerokosc];
  353. }
  354. for (int j = 0; j < Obraz->wysokosc; j++) {
  355. tab[j * Obraz->szerokosc + Obraz->szerokosc - 1] = Obraz->tablicaPikseli[j * Obraz->szerokosc + Obraz->szerokosc - 1];
  356. }
  357.  
  358.  
  359. free(Obraz->tablicaPikseli);
  360. Obraz->tablicaPikseli = tab;
  361. return 0;
  362. }
  363.  
  364. int* Histogram(obraz* Obraz) {
  365. int* bins = calloc((Obraz->maksWartoscSzarosci + 1), sizeof(*bins));
  366. int iloscPikseli = Obraz->szerokosc * Obraz->wysokosc;
  367. int srodekHistogramu = 0;
  368.  
  369. if (!bins) {
  370. printf("Blad alokacj pamieci\n");
  371. return -1;
  372. }
  373.  
  374. int suma = 0;
  375. for (int i = 0; i < Obraz->wysokosc; i++)
  376. {
  377. for (int j = 0; j < Obraz->szerokosc; j++)
  378. {
  379. ++bins[Obraz->tablicaPikseli[i * Obraz->szerokosc + j]];
  380. }
  381. }
  382. FILE* plik;
  383. char nazwaPliku[MAXSTRLEN] = "Histogram ";
  384. strcat(nazwaPliku, Obraz->nazwa);
  385. strcat(nazwaPliku, ".txt");
  386. fopen_s(&plik, nazwaPliku, "w");
  387.  
  388. if (plik == NULL) {
  389. printf("Blad przy otwieraniu pliku.\n");
  390. return -1;
  391. }
  392. for (int i = 0; i < Obraz->maksWartoscSzarosci + 1; i++)
  393. {
  394. fprintf(plik, "%d,%d\n", i, bins[i]);
  395. suma += bins[i];
  396. }
  397. printf("Ilosc pikseli w binach: %d\n\nIlosc oczekiwana: %d\n\n", suma, iloscPikseli);
  398.  
  399. char komenda[MAXSTRLEN] = "python3 HistogramPlotter.py \"";
  400. strcat(komenda, nazwaPliku);
  401. strcat(komenda, "\"");
  402.  
  403. fclose(plik);
  404. system(komenda);
  405.  
  406. return bins;
  407. }
  408.  
  409. int Szum(obraz* obrazSzumiony, int procent_szumu) {
  410. int* tab;
  411. int dlugosc_tablicy = obrazSzumiony->wysokosc * obrazSzumiony->szerokosc;
  412.  
  413. DEKLARACJATABLICY
  414. int* ptr = tab;
  415.  
  416. SPRAWDZTABLICE
  417.  
  418. srand(time(NULL));
  419.  
  420. for (int i = 0; i < obrazSzumiony->wysokosc; i++)
  421. {
  422. for (int f = 0; f < obrazSzumiony->szerokosc; f++)
  423. {
  424. tab[i * obrazSzumiony->szerokosc + f] = (rand() % 100 + 1) <= procent_szumu ? rand() % 2 ? obrazSzumiony->maksWartoscSzarosci : 0 : obrazSzumiony->tablicaPikseli[i * obrazSzumiony->szerokosc + f];
  425. }
  426. }
  427.  
  428. free(obrazSzumiony->tablicaPikseli);
  429. obrazSzumiony->tablicaPikseli = tab;
  430. return 0;
  431. }
  432.  
  433. void Transpozycja(obraz* obrazTransponowany, int liczba_obrotow) {
  434. int* obroconaTablica;
  435.  
  436. for (int i = 0; i < liczba_obrotow; i++)
  437. {
  438. obroconaTablica = malloc(obrazTransponowany->wysokosc * obrazTransponowany->szerokosc * sizeof(*obrazTransponowany->tablicaPikseli));
  439.  
  440. if (!obroconaTablica) {
  441. printf("blad alokacji pamieci\n");
  442. return;
  443. }
  444.  
  445. for (int wys = 0; wys < obrazTransponowany->wysokosc; wys++)
  446. {
  447. for (int szer = 0; szer < obrazTransponowany->szerokosc; szer++)
  448. {
  449. obroconaTablica[(obrazTransponowany->szerokosc - 1 - szer) * obrazTransponowany->wysokosc + wys] = obrazTransponowany->tablicaPikseli[wys * obrazTransponowany->szerokosc + szer];
  450. }
  451. }
  452.  
  453. int temp = obrazTransponowany->wysokosc;
  454. obrazTransponowany->wysokosc = obrazTransponowany->szerokosc;
  455. obrazTransponowany->szerokosc = temp;
  456.  
  457. free(obrazTransponowany->tablicaPikseli);
  458. obrazTransponowany->tablicaPikseli = obroconaTablica;
  459. }
  460. return;
  461. }
  462.  
  463. int ZapiszPlik(obraz* zapObraz, char nazwaPliku[]) {
  464. FILE* plik;
  465. int i = 0;
  466. int j = 0;
  467. fopen_s(&plik, nazwaPliku, "w");
  468.  
  469. if (plik == NULL) {
  470. printf("Blad przy otwieraniu pliku.\n");
  471. return 2;
  472. }
  473.  
  474. int krok_zapisu = 0;
  475.  
  476. while (krok_zapisu != 100) {
  477. switch (krok_zapisu) {
  478. case 0:
  479. fprintf(plik, "P%d\n", zapObraz->standard);
  480. krok_zapisu = 1;
  481. break;
  482. case 1:
  483. for (i = 0; i < zapObraz->indeksKomentarza; i++) {
  484. fprintf(plik, "#%s\n", zapObraz->komentarze[i]);
  485. }
  486. krok_zapisu = 2;
  487. break;
  488. case 2:
  489. fprintf(plik, "%d %d\n", zapObraz->szerokosc, zapObraz->wysokosc);
  490. krok_zapisu = 3;
  491. break;
  492. case 3:
  493. fprintf(plik, "%d\n", zapObraz->maksWartoscSzarosci);
  494. krok_zapisu = 4;
  495. break;
  496. case 4:
  497. for (i = 0; i < zapObraz->wysokosc; i++) {
  498. for (j = 0; j < zapObraz->szerokosc; j++) {
  499. fprintf(plik, "%d ", *(zapObraz->tablicaPikseli + j + i * zapObraz->szerokosc));
  500. }
  501. fprintf(plik, "\n");
  502. }
  503. krok_zapisu = 100;
  504. break;
  505. default:
  506. break;
  507. }
  508. }
  509.  
  510. fclose(plik);
  511.  
  512. printf("Zapisano plik %s\n", nazwaPliku);
  513. return 0;
  514. }
  515.  
  516. int WczytajPlik(obraz* wczytObraz, obraz** tabObrazow, int* dlugoscTablicyObrazow) {
  517. int test = 0;
  518. int status_skanu = 0;
  519. fpos_t pozycja_wskaznika = 0;
  520. FILE* plik = NULL;
  521.  
  522. //system("cls");
  523.  
  524. fopen_s(&plik, wczytObraz->nazwa, "r");
  525. if (plik == NULL) {
  526. printf("Blad przy otwieraniu pliku.\n");
  527. return 2;
  528. }
  529. if ((test = CzytajPlik(plik, wczytObraz, tabObrazow, dlugoscTablicyObrazow)) != 8) {
  530. printf("\nBlad odczytu danych z pliku\nKod Bledu: %d\n", test);
  531. return -1;
  532. }
  533.  
  534. fclose(plik);
  535.  
  536. printf("Wczytano plik %s\n", wczytObraz->nazwa);
  537.  
  538. return 0;
  539. }
  540.  
  541. int UsunObraz(obraz** tabObr, int* tabObrLen, int indeksObr) {
  542. int ostatni = *tabObrLen;
  543. int m = 0;
  544. int nr = indeksObr;
  545.  
  546. ostatni--;
  547. free((*tabObr)[indeksObr].tablicaPikseli);
  548. free((*tabObr)[indeksObr].komentarze);
  549. for (m = nr; m < ostatni; m++) {
  550. (*tabObr)[m] = (*tabObr)[m + 1];
  551. }
  552.  
  553. if (!ostatni) {
  554. *tabObr = malloc(sizeof(obraz));
  555. *tabObrLen = ostatni;
  556. return 0;
  557. }
  558.  
  559. obraz* ptr = realloc(*tabObr, ostatni * sizeof(**tabObr));
  560. SPRAWDZTABLICE
  561. * tabObr = ptr;
  562. *tabObrLen = ostatni;
  563. return 0;
  564. }
  565.  
  566. int CzytajPlik(FILE* plik, obraz* wczytObraz, obraz** tabObrazow, int* dlugoscTablicyObrazow) {
  567. int krok_wczytania = 1;
  568. int poprzedni_krok = 0;
  569. int koniec_odczytu = 0;
  570. int i = 0;
  571. int j = 0;
  572. int k = 0;
  573. char znak;
  574. int* tab = NULL;
  575. int dlugosc_tablicy = 0;
  576. char liczba[MAXSTRLEN];
  577.  
  578. char* ptr2; //tworzenie tablicy dla komentarzy
  579. ptr2 = malloc(1 * sizeof(char*));
  580.  
  581. if (!ptr2) {
  582. printf("Blad przy przydzielaniu pamieci do bufora\n");
  583. return -1;
  584. }
  585.  
  586. wczytObraz->komentarze = ptr2;
  587. wczytObraz->indeksKomentarza = 0;
  588.  
  589. while (!feof(plik))
  590. {
  591. if ((znak = fgetc(plik)) > 32 || (znak == '\n' && krok_wczytania == 0)) //jezeli pobrany znak jest w z tablicy ASCI jakims symbolem (wszystkie maja powyzej 32 wartosc) lub trafiono na bialy znak i tryb komentarza
  592. {
  593. if (znak == '#') //realokacja tablicy w przypadku napotkania komentarzu
  594. {
  595. if (krok_wczytania != 0)
  596. {
  597. char* ptr = realloc(wczytObraz->komentarze, (wczytObraz->indeksKomentarza + 1) * sizeof(char*));
  598.  
  599. SPRAWDZTABLICE //warunek globalny czy jest jeszcze miejsce na powiekszenie tablicy
  600.  
  601.  
  602. wczytObraz->komentarze = ptr;
  603. wczytObraz->komentarze[wczytObraz->indeksKomentarza] = malloc(MAXSTRLEN * sizeof(char)); //przepisanie komentarzy do realokowanej tablicy
  604.  
  605. if (!(wczytObraz->komentarze[wczytObraz->indeksKomentarza])) {
  606. printf("\nBlad przy przydzielaniu pamieci\n");
  607. return -1;
  608. }
  609.  
  610. poprzedni_krok = krok_wczytania;
  611. }
  612. krok_wczytania = 0;
  613. continue;
  614. }
  615. switch (krok_wczytania)
  616. {
  617. case 0: //tryb komentarza
  618. if (znak == '\n') {
  619. wczytObraz->komentarze[wczytObraz->indeksKomentarza][k] = '\0';
  620. wczytObraz->indeksKomentarza++;
  621. k = 0;
  622. krok_wczytania = poprzedni_krok;
  623. continue;
  624. }
  625. (wczytObraz->komentarze[wczytObraz->indeksKomentarza])[k] = znak;
  626. k++;
  627. break;
  628. case 1://SprawdŸz pierwszy element standardu - sposób kodowania
  629. if (znak == 'P' || znak == 'p')
  630. {
  631. krok_wczytania = 2;
  632. continue;
  633. }
  634. else
  635. {
  636. printf("\nNie znaleziono standardu kodowania obrazu (powinien sie znalezc na pierwszym miejscu w pliku)\n");
  637. return krok_wczytania;
  638. }
  639. break;
  640. case 2://SprawdŸz czy numer standardu kodowania jest prawidłowy...
  641. if (znak - 48 != 2) //w ASCI 2 ma 50
  642. {
  643. printf("\nNiepoprawny standard kodowania - obraz musi byc zakodowany w standardzie P2.\n");
  644. return krok_wczytania;
  645. }
  646. else
  647. {
  648. wczytObraz->standard = znak - 48;
  649. krok_wczytania = 3;
  650. continue;
  651. }
  652. break;
  653. case 3://Wczytaj szerokosc obrazu...
  654. i = WczytajLiczbe(plik, znak); //po prawidlowym odczycie zwracana jest dodatnia wartosc a jezeli nie to ujemna
  655. if (i > 0)
  656. {
  657. wczytObraz->szerokosc = i;
  658. krok_wczytania = 4;
  659. }
  660. else
  661. {
  662. if (!i) //na wypadek gdyby odczytano 0
  663. {
  664. printf("\nSzerokosc obrazu nie moze byc 0\n");
  665. }
  666. return krok_wczytania; //powrot do case 3
  667. }
  668. i = 0;
  669. break;
  670. case 4://Wczytaj wysokosc obrazu...
  671. i = WczytajLiczbe(plik, znak);
  672. if (i > 0) {
  673. wczytObraz->wysokosc = i;
  674. krok_wczytania = 5;
  675. }
  676. else
  677. {
  678. if (!i)
  679. {
  680. printf("\nWysokosc obrazu nie moze byc 0\n");
  681. }
  682. return krok_wczytania;
  683. }
  684. i = 0;
  685. break;
  686. case 5://Wczytaj maksymalny odcien szarosci...
  687. i = WczytajLiczbe(plik, znak);
  688. if (i >= 0) {
  689. wczytObraz->maksWartoscSzarosci = i;
  690. krok_wczytania = 6;
  691. }
  692. else
  693. {
  694. return krok_wczytania;
  695. }
  696. i = 0;
  697. j = 0;
  698. break;
  699. case 6: //Sprawdz czy dlugosc danych sie zgadza a jezeli tak to utworz tablice i sprawdz czy przydzielono pamiec
  700. dlugosc_tablicy = wczytObraz->szerokosc * wczytObraz->wysokosc < INT_MAX ? wczytObraz->szerokosc * wczytObraz->wysokosc : 0;
  701.  
  702. if (!dlugosc_tablicy)
  703. {
  704. printf("\nPrzekroczenie maksymalnej wartosci zmiennej typu int\n");
  705. return krok_wczytania;
  706. }
  707.  
  708. DEKLARACJATABLICY;
  709. if (!tab) {
  710. printf("\nBlad przy przydzielaniu pamieci do tablicy.\n");
  711. return krok_wczytania;
  712. }
  713.  
  714. krok_wczytania = 7;
  715. //fseek(plik, -1, SEEK_CUR);
  716. case 7://Wczytaj tablice pikseli...
  717.  
  718. if (j >= wczytObraz->szerokosc) {
  719. i++;
  720. j = 0;
  721. }
  722.  
  723. if (i < wczytObraz->wysokosc) {
  724. int test = 0;
  725. *(tab + i * wczytObraz->szerokosc + j) = (((test = WczytajLiczbe(plik, znak)) >= 0) && (test <= wczytObraz->maksWartoscSzarosci)) ? test : -2;
  726.  
  727. if (*(tab + i * wczytObraz->szerokosc + j) < 0) {
  728. printf("\nBlad wartosci pikseli w pliku obrazu.\n");
  729. return krok_wczytania;
  730. }
  731. j++;
  732. continue;
  733. }
  734.  
  735. krok_wczytania = 8;
  736. continue;
  737. case 8://krok bledu
  738. printf("\nNiepoprawna tablica pikseli w pliku - niejezdoznacznosc wysokosci i szerokosci z podanymi danymi.\n");
  739. return 0;
  740. }
  741. }
  742. }
  743. if (i == wczytObraz->wysokosc - 1 && j == wczytObraz->szerokosc)
  744. {
  745. wczytObraz->tablicaPikseli = tab;
  746. obraz* ptr;
  747. (*dlugoscTablicyObrazow) += 1;
  748. ptr = realloc(*tabObrazow, *dlugoscTablicyObrazow * sizeof(**tabObrazow));
  749.  
  750. SPRAWDZTABLICE
  751.  
  752. * tabObrazow = ptr;
  753. (*tabObrazow)[*dlugoscTablicyObrazow - 1] = *wczytObraz;
  754. krok_wczytania = 8;
  755. printf("\nPoprawnie wczytano tablice o szerokosci %d i wysokosci %d\n", wczytObraz->szerokosc, wczytObraz->wysokosc);
  756. }
  757. else {
  758. krok_wczytania = -1;
  759. printf("\nNiepoprawna tablica pikseli w pliku - niejezdoznacznosc wysokosci i szerokosci z podanymi danymi.\n");
  760. return krok_wczytania;
  761. }
  762. return krok_wczytania;
  763. }
  764.  
  765. int WczytajLiczbe(FILE* plik, char cyfra)
  766. {
  767. int i = 0;
  768. char liczba[MAXSTRLEN]; //char bo konwercja inaczej by sie nie dalo w tablice wpisac 123\0
  769. int liczbaInt = -2;
  770. do
  771. {
  772. if (i < MAXSTRLEN - 1)
  773. {
  774. liczba[i] = cyfra;
  775. i++;
  776. }
  777. else //jesli szerokosc wyszlaby po za zakres - co jest raczej niemozliwe ale lepiej dmuchac na zimne
  778. {
  779. printf("\nPrzekroczono dlugosc bufora odczytu\n");
  780. return -4;
  781. }
  782. } while ((cyfra = fgetc(plik)) - 48 <= 9 && cyfra - 48 >= 0); //dopoki sa z zakresu 48 - 57 w kodzie ascii czyli cyfry, to bedzie przypisywac do tablicy
  783.  
  784.  
  785. if (cyfra == '#')
  786. {
  787. fseek(plik, -1, SEEK_CUR); //cofnij pozycje wskaznika o 1 do tylu jezeli napotka komentarz bo potem juz nic nie ma
  788. }
  789.  
  790. if (i) //gdy skonczy czytac szerokosc to przypisz ostatniemu elementowi tablicy bialy znak
  791. {
  792. liczba[i] = '\0';
  793. }
  794. else {
  795. printf("\nBlad przy pobieraniu danej liczbowej.\n");
  796. return -1;
  797. }
  798.  
  799. if (!(liczbaInt = strtol(liczba, NULL, 10) <= INT_MAX ? (int)strtol(liczba, NULL, 0) : 0) && strcmp("0", liczba)) //warunek 3 argumentowy jezeli long int poza zakres wyleci to bedzie rownal sie 0
  800. {
  801. printf("\nBlad przy pobieraniu danej liczbowej.\n");
  802. return -3; //zabezpieczenie gdyby w buforze bylo np. 113a ... bez tego # ale to juz jest poza zakres programu ktory robimy
  803. } // przekonwertowanie liczb na system dziesietny - gotowy wzór
  804.  
  805. return liczbaInt; //zwracana zmienna ma wartosc przekonwertowanej liczby na int w postaci 64 bitowego zapisu - INT_MAX to maksymalna wartosc int
  806. }
  807.  
  808.  
  809. int WczytajKonsola(char komunikat[], int granica_dolna, int granica_gorna, int* kontrolka) {
  810. char c;
  811.  
  812. printf("\n %s \nWcisnij ',' aby powrocic do menu\nZakres: %d do %d\n", komunikat, granica_dolna, granica_gorna);
  813. while (scanf("%d", kontrolka) == 0 || (*kontrolka < granica_dolna || *kontrolka > granica_gorna)) {
  814. while ((c = getchar()) != '\n') {
  815. if (c == ',') {
  816. printf("\nWracam do menu\n");
  817. return -1;
  818. }
  819. }
  820. printf("Podaj prawidlowa cyfre z odpowiedniego zakresu\n");
  821. }
  822.  
  823. return 0;
  824. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement