Advertisement
Mateusz8868

Untitled

May 23rd, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.34 KB | None | 0 0
  1. /*
  2. ;===============================================================================;
  3. ; ;
  4. ; Plik : Z4.cpp ;
  5. ; Format : EXE ;
  6. ; Cwiczenie : Tryb graficzny i przetwarzanie obrazów ;
  7. ; Autorzy : Mateusz Woskowicz 208345, ;
  8. ; : Krzysztof Jablonski 208345, ;
  9. ; : sroda, 8:30 ;
  10. ; ;
  11. ;===============================================================================;
  12. */
  13.  
  14. #include <iostream.h>
  15. #include <fstream.h>
  16. #include <dos.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <conio.h>
  20. #include <iomanip.h>
  21. #include <string.h>
  22. #include <math.h>
  23.  
  24. //definicje typów:
  25. typedef unsigned char BYTE;
  26. typedef unsigned int WORD;
  27. typedef unsigned int UINT;
  28. typedef unsigned long DWORD;
  29. typedef unsigned long LONG;
  30.  
  31. struct BITMAPFILEHEADER
  32. {
  33. UINT bfType; //Opis formatu pliku. Musi być ‘BM’.
  34. DWORD bfSize; //Rozmiar pliku BMP w bajtach.
  35. UINT bfReserved1; //Zarezerwowane. Musi być równe 0.
  36. UINT bfReserved2; //Zarezerwowane. Musi być równe 0.
  37. DWORD bfOffBits; //Przesunięcie w bajtach początku danych
  38. };
  39.  
  40. struct BITMAPINFOHEADER
  41. {
  42. DWORD biSize; //Rozmiar struktury BITMAPINFOHEADER.
  43. LONG biWidth; //Szerokość bitmapy w pikselach.
  44. LONG biHeight; //Wysokość bitmapy w pikselach.
  45. WORD biPlanes; //Ilość płaszczyzn. Musi być 1.
  46. WORD biBitCount; //Głębia kolorów w bitach na piksel.
  47. DWORD biCompression; //Rodzaj kompresji (0 – brak).
  48. DWORD biSizeImage; //Rozmiar obrazu w bajtach. Uwaga może być 0.
  49. LONG biXPelsPerMeter;//Rozdzielczość pozioma w pikselach na metr.
  50. LONG biYPelsPerMeter;//Rozdzielczość pionowa w pikselach na metr.
  51. DWORD biClrUsed; //Ilość używanych kolorów z palety.
  52. DWORD biClrImportant; //Ilość kolorów z palety niezbędnych do
  53. }; //wyświetlenia obrazu.
  54.  
  55. struct RGBQUAD //pojedynczy kolor jest opisany za pomocą struktury zwanej paletą kolorów. (256 kolorow)
  56. {
  57. BYTE rgbBlue; //każdy wpis znajdujacy sie w palecie opisuje składowe RGB koloru
  58. BYTE rgbGreen; //każda składowa może przyjmować wartości z przedziału od 0 do 63
  59. BYTE rgbRed;
  60. BYTE rgbReserved;
  61. };
  62.  
  63.  
  64. FILE *bitmap_file; //Plik bitmapy
  65. unsigned char far* video_memory = (BYTE *)0xA0000000L; //Aby dokonać wpisu do pamięci ekranu (ustawić wartość wybranego piksela)
  66. //można posłużyć się wskaźnikiem dalekim:
  67.  
  68. void TrybGraficzny()
  69. {
  70. REGPACK regs;
  71. regs.r_ax = 0x13; //Tryb 13h jest trybem graficznym obecnym w kartach VGA i nowszych. grafika o rozdzielczości 320 x 200
  72. intr(0x10, &regs); //0A000h:0000h i zajmuje dokładnie 640000 bajtów.
  73. }
  74.  
  75. void TrybTekstowy()
  76. {
  77. REGPACK regs;
  78. regs.r_ax = 0x10; //Tryb 10h jest trybem tekstowym
  79. intr(0x10, &regs);
  80. }
  81.  
  82. int main()
  83. {
  84. BITMAPFILEHEADER bmfh; //nagłowek nr 1 bitmapy
  85. BITMAPINFOHEADER bmih; //nagłowek nr 2 bitmapy
  86. RGBQUAD palette[256];
  87.  
  88. int wybor_opcji,m,n,i,prog,numer,tmp,jasnosc;
  89. char* pathname[40];
  90.  
  91. cout<<"Ktory obrazek wczytac?\n1.lena.bmp\n2.aero.bmp\n3.boat.bmp\n4.bridge.bmp\n ";
  92. cin>>numer;
  93. switch(numer)
  94. {
  95. case 1:
  96. *pathname = "C:\\borlandc\\bin\\lena.bmp";
  97. break;
  98. case 2:
  99. *pathname = "C:\\borlandc\\bin\\aero.bmp";
  100. break;
  101. case 3:
  102. *pathname = "C:\\borlandc\\bin\\boat.bmp";
  103. break;
  104. case 4:
  105. *pathname = "C:\\borlandc\\bin\\bridge.bmp";
  106. break;
  107. default:
  108. cout<<"Podano zla opcje, wybrano domyslnie plik lena.bmp.";
  109. *pathname = "C:\\borlandc\\bin\\lena.bmp";
  110. break;
  111. }
  112.  
  113. //size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
  114. //ptr - wskaźnik na tablicę
  115. //size - rozmiar elementu tablicy
  116. //nitems - liczba elementów do odczytania
  117. //stream - plik, na którym wykonywana jest operacja
  118.  
  119. bitmap_file = fopen(*pathname, "rb"); //otworz plik
  120. fread (&bmfh, sizeof(BITMAPFILEHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 1 i zapamiętaj w zmiennej bmfh
  121. fread (&bmih, sizeof(BITMAPINFOHEADER), 1, bitmap_file); ////odczytaj z pliku nagłówek nr 2 i zapamiętaj w zmiennej bmih
  122. fread(palette, sizeof(RGBQUAD), 256, bitmap_file); //- wszystkich przekształceń dokonujemy na palecie
  123. //(ten sam efekt, jak byśmy dokonywali ich na pikselach obrazu). Pliku załadowanego do pamięci karty graficznej NIE ruszamy.
  124.  
  125. cout<<"Program wykonujacy operacje na bitmapie\n1.Negacja\n2.Progowanie\n3.Zmiana jasnosci\nWybierz jedna z operacji: ";
  126. cin>>wybor_opcji;
  127. switch(wybor_opcji)
  128. {
  129. ////////////////////////////Negacja/////////////////////////////////
  130. case 1:
  131. {
  132. cout<<"Przed zmiana:\n";
  133. getch(); //oczekiwanie na przycisk
  134. TrybGraficzny(); //wlaczenie trybu graficznego
  135. outportb(0x03C8, 0); //rozpocznij ustawianie palety od koloru nr 0
  136. for (i = 0; i < 255; i++) //ilość kolorów w palecie 8-bitowej
  137. {
  138. outp(0x03C9, palette[i].rgbRed * 63 / 255); //skalowana składowa R
  139. outp(0x03C9, palette[i].rgbGreen * 63 / 255); //skalowana składowa G
  140. outp(0x03C9, palette[i].rgbBlue * 63 / 255); //skalowana składowa B
  141. }
  142.  
  143. for( m = 199; m >= 0;--m)
  144. {
  145. for( n = 0;n < 320; ++n)
  146. {
  147. BYTE l; //definiujemy piksel
  148. fread(&l,sizeof(BYTE),1, bitmap_file); //odczytaj piksel
  149. video_memory[m * 320 + n] = l; //ustaw m*320 + n piksel obrazu na kolor l aktualnej palety karty VGA
  150. }
  151. }
  152.  
  153. fclose(bitmap_file); //zamknij plik
  154. getch(); //oczekiwanie na przycisk
  155.  
  156. TrybTekstowy(); //wlaczenie trybu tekstowego
  157. cout<<"Po zmianie:\n";
  158. getch();
  159.  
  160. TrybGraficzny(); //wlaczenie trybu graficznego
  161. bitmap_file = fopen(*pathname, "rb"); //otwórz plik do odczytu w trybie binarnym "rb"
  162. fread (&bmfh, sizeof(BITMAPFILEHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 1 i zapamiętaj w zmiennej bmfh
  163. fread (&bmih, sizeof(BITMAPINFOHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 2 i zapamiętaj w zmiennej bmih
  164. fread(palette, sizeof(RGBQUAD), 256, bitmap_file); //- wszystkich przekształceń dokonujemy na palecie
  165. //(ten sam efekt, jak byśmy dokonywali ich na pikselach obrazu). Pliku załadowanego do pamięci karty graficznej NIE ruszamy.
  166. outportb(0x03C8, 0); //rozpocznij ustawianie palety od koloru nr 0
  167. for (i = 0; i < 255; i++) //ilość kolorów w palecie 8-bitowej
  168. {
  169. outp(0x03C9, ~palette[i].rgbRed * 63 / 255); //skalowana składowa R
  170. outp(0x03C9, ~palette[i].rgbGreen * 63 / 255); //skalowana składowa G
  171. outp(0x03C9, ~palette[i].rgbBlue * 63 / 255); //skalowana składowa B
  172. }
  173.  
  174. for( m = 199; m >= 0; --m)
  175. {
  176. for( n = 0; n < 320; ++n)
  177. {
  178. BYTE l; //definiujemy piksel o 256 kolorach
  179. fread(&l,sizeof(BYTE),1, bitmap_file); //czytamy piksel
  180. video_memory[m * 320 + n] = l; ////ustaw m*320 + n piksel obrazu na kolor l aktualnej palety karty VGA
  181. }
  182. }
  183. fclose(bitmap_file); //zamykamy plik
  184. getch(); //czekamy na przycisk
  185. break;
  186. }
  187. ////////////////////////////Progowanie/////////////////////////////////
  188. case 2:
  189. {
  190. cout<<"Podaj wartosc progu : (0 - 255)" <<endl;
  191. cin>>prog;
  192. if(prog < 0 || prog > 255)
  193. {
  194. cout<<"Podano zla wartosc progu";
  195. break;
  196. }
  197. else
  198. {
  199. cout<<"Obraz przed progowaniem:";
  200. getch();
  201. TrybGraficzny();
  202. bitmap_file = fopen(*pathname, "rb"); //otwórz plik do odczytu w trybie binarnym "rb"
  203. fread (&bmfh, sizeof(BITMAPFILEHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 1 i zapamiętaj w zmiennej bmfh
  204. fread (&bmih, sizeof(BITMAPINFOHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 2 i zapamiętaj w zmiennej bmih
  205. fread(palette, sizeof(RGBQUAD), 256, bitmap_file); //- wszystkich przekształceń dokonujemy na palecie
  206. //(ten sam efekt, jak byśmy dokonywali ich na pikselach obrazu). Pliku załadowanego do pamięci karty graficznej NIE ruszamy.
  207.  
  208. outportb(0x03C8, 0); //rozpocznij ustawianie palety od koloru nr 0
  209. for (i = 0; i < 255; i++) //ilość kolorów w palecie 8-bitowej
  210. {
  211. outp(0x03C9, palette[i].rgbRed * 63 / 255); //skalowana składowa R
  212. outp(0x03C9, palette[i].rgbGreen * 63 / 255); //skalowana składowa
  213. outp(0x03C9, palette[i].rgbBlue * 63 / 255); //skalowana składowa B
  214. }
  215. for( m = 199; m >= 0;--m)
  216. {
  217. for( n = 0;n < 320; ++n)
  218. {
  219. BYTE l; //definiujemy piksel o 8-bitowej wartosci koloru
  220. fread(&l,sizeof(BYTE),1, bitmap_file); //odczytujemy piksel
  221. video_memory[m * 320 + n] = l; //ustaw m*320 + n piksel obrazu na kolor l aktualnej palety karty VGA
  222. }
  223. }
  224. fclose(bitmap_file); //zamknij plik
  225. getch(); //zatrzymuje dopoki uzytkownik nie wpisze znaku
  226. TrybTekstowy(); //przelacza do trybu tekstowego
  227. cout<<"Obraz po progowaniu:";
  228. getch(); //zatrzymuje dopoki uzytkownik nie wpisze znaku
  229.  
  230. TrybGraficzny(); //przelacza do trybu graficznego
  231. bitmap_file = fopen(*pathname, "rb"); //otwórz plik do odczytu w trybie binarnym "rb"
  232. fread (&bmfh, sizeof(BITMAPFILEHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 1 i zapamiętaj w zmiennej bmfh
  233. fread (&bmih, sizeof(BITMAPINFOHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 2 i zapamiętaj w zmiennej bmih
  234. fread(palette, sizeof(RGBQUAD), 256, bitmap_file); // wszystkich przekształceń dokonujemy na palecie
  235. //(ten sam efekt, jak byśmy dokonywali ich na pikselach obrazu). Pliku załadowanego do pamięci karty graficznej NIE ruszamy.
  236.  
  237. outportb(0x03C8, 0); //rozpocznij ustawianie palety od koloru nr 0
  238. for (i = 0; i < 255; i++) //ilość kolorów w palecie 8-bitowej
  239. {
  240. outp(0x03C9, palette[i].rgbRed * 63 / 255); //skalowana składowa R
  241. outp(0x03C9, palette[i].rgbGreen * 63 / 255); //skalowana składowa
  242. outp(0x03C9, palette[i].rgbBlue * 63 / 255); //skalowana składowa B
  243. }
  244.  
  245. for( m = 199; m >= 0; --m)
  246. {
  247. for( n = 0; n < 320; ++n)
  248. {
  249. BYTE l; //definiujemy piksel
  250. fread(&l,sizeof(BYTE),1, bitmap_file); //czytamy piksel
  251. video_memory[m * 320 + n] = l; //ustaw m*320 + n piksel obrazu na kolor l aktualnej palety karty VGA
  252. if(video_memory[m * 320 + n] < prog) //jesli wartośc koloru w pikselu video_memory jest mniejsza od progu
  253. {
  254. video_memory[m * 320 + n] = 0; //ustaw ja na zero
  255. }
  256. }
  257. }
  258. fclose(bitmap_file); //zamykamy plik
  259. getch(); //czekamy na przycisk
  260. }
  261. break;
  262. }
  263. ////////////////////////////Rozjasnianie/////////////////////////////////
  264. case 3:
  265. {
  266. char t;
  267. int red,gre,blu;
  268. cout<<"Chcesz rozjasnic [t/T] czy przyciemnic [n/N/*]: ";
  269. cin>>t;
  270. if(t == 't' || t == 'T')
  271. {
  272. cout<<"Obraz zostanie rozjasniony.\n";
  273. cout<<"Podaj wartosc rozjasnienia(liczba calkowita 0-10): ";
  274. cin>>jasnosc;
  275. if(jasnosc > 10)
  276. {
  277. cout<<"Przyjeto wartosc: "<<jasnosc%10<<", gdyz ta podana byla bledna.\n";
  278. jasnosc=jasnosc%10;
  279. getch();
  280. }
  281. else
  282. if(jasnosc < 0)
  283. {
  284. cout<<"Przyjeto wartosc: "<<jasnosc%10*(-1)<<", gdyz ta podana byla bledna.\n";
  285. jasnosc=jasnosc%10*(-1);
  286. getch();
  287. }
  288. }
  289. else
  290. {
  291. cout<<"Obraz zostanie przyciemniony. \n";
  292. cout<<"Podaj wartosc przyciemnienia(liczba calkowita 0-10): ";
  293. cin>>jasnosc;
  294. if(jasnosc > 10)
  295. {
  296. cout<<"Przyjeto wartosc: "<<jasnosc%10<<", gdyz ta podana byla bledna.\n";
  297. jasnosc=jasnosc%10*(-1);
  298. }
  299. else
  300. if(jasnosc < 0)
  301. {
  302. cout<<"Przyjeto wartosc: "<<jasnosc%10*(-1)<<", gdyz ta podana byla bledna.\n";
  303. jasnosc=jasnosc%10;
  304. }
  305. else
  306. jasnosc *= (-1);
  307. getch();
  308. }
  309. bitmap_file = fopen(*pathname, "rb"); //otworz plik
  310. fread (&bmfh, sizeof(BITMAPFILEHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 1 i zapamiętaj w zmiennej bmfh
  311. fread (&bmih, sizeof(BITMAPINFOHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 2 i zapamiętaj w zmiennej bmih
  312. fread(palette, sizeof(RGBQUAD), 256, bitmap_file); // wszystkich przekształceń dokonujemy na palecie
  313. //(ten sam efekt, jak byśmy dokonywali ich na pikselach obrazu). Pliku załadowanego do pamięci karty graficznej NIE ruszamy.
  314. TrybGraficzny(); //Wlaczamy tryb graficzny
  315. outportb(0x03C8, 0); //rozpocznij ustawianie palety od koloru nr 0
  316.  
  317. for (i = 0; i < 255; i++) //ilość kolorów w palecie 8-bitowej
  318. {
  319. outp(0x03C9, palette[i].rgbRed * 63 / 255); //skalowana składowa R
  320. outp(0x03C9, palette[i].rgbGreen * 63 / 255); //skalowana składowa G
  321. outp(0x03C9, palette[i].rgbBlue * 63 / 255); //skalowana składowa B
  322. }
  323.  
  324. for( m = 199; m >= 0;--m)
  325. {
  326. for( n = 0;n < 320; ++n)
  327. {
  328. BYTE l; //definiujemy piksel 8-bitowy
  329. fread(&l,sizeof(BYTE),1, bitmap_file); //czytamy go
  330. video_memory[m * 320 + n] = l; //ustaw m*320 + n piksel obrazu na kolor l aktualnej palety karty VGA
  331. }
  332. }
  333. fclose(bitmap_file); //zamykamy plik (piksel)
  334. getch(); //czekamy na przycisk
  335.  
  336. TrybTekstowy(); //wlaczamy tryb tekstowy
  337. cout<<"Po zmianie:\n";
  338. getch(); //czekamy na przycisk
  339. TrybGraficzny(); //wlaczamy tryb graficzny
  340. bitmap_file = fopen(*pathname, "rb"); //przelacza do trybu graficznego
  341. fread (&bmfh, sizeof(BITMAPFILEHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 1 i zapamiętaj w zmiennej bmfh
  342. fread (&bmih, sizeof(BITMAPINFOHEADER), 1, bitmap_file); //odczytaj z pliku nagłówek nr 2 i zapamiętaj w zmiennej bmih
  343. fread(palette, sizeof(RGBQUAD), 256, bitmap_file); // wszystkich przekształceń dokonujemy na palecie
  344. //(ten sam efekt, jak byśmy dokonywali ich na pikselach obrazu). Pliku załadowanego do pamięci karty graficznej NIE ruszamy.
  345.  
  346. outportb(0x03C8, 0); //rozpocznij ustawianie palety od koloru nr 0
  347. for (i = 0; i < 255; i++) //ilość kolorów w palecie 8-bitowej
  348. {
  349. outp(0x03C9, palette[i].rgbRed * 63 / 255); //skalowana składowa R
  350. outp(0x03C9, palette[i].rgbGreen * 63 / 255); //skalowana składowa
  351. outp(0x03C9, palette[i].rgbBlue * 63 / 255); //skalowana składowa B
  352. }
  353.  
  354. for (i = 200; i >= 0; --i)
  355. {
  356. for (int j = 0; j < 320; ++j)
  357. {
  358. BYTE l; //definiujemy piksel 8-bitowy
  359. fread(&l, sizeof(BYTE), 1, bitmap_file); //czytamy go
  360. if(jasnosc > 0)
  361. {
  362. tmp = (256 - l) / 11; //odejmujemy wartosc piksela od 255 (max wartosci RGB - bialy), zeby obrazek stal sie jasniejszy i zapisujemy w zmiennej pomocniczej
  363. tmp *= jasnosc; //mnozymy wartosc tymczasowa przez jasnosc
  364. }
  365. else if(jasnosc < 0)
  366. {
  367. tmp = l/11;
  368. tmp *= jasnosc; //mnozymy wartosc tymczasowa przez jasnosc
  369. }
  370. l = l + tmp; //dodajemy wartosc tymczasowa jasmosci do piksela
  371. video_memory[i * 320 + j] = l; //ustaw i*320 + j piksel obrazu na kolor l aktualnej palety karty VGA
  372. }
  373. }
  374. fclose(bitmap_file); //zamykamy plik
  375. getch(); //czekamy na przycisk
  376. break;
  377. }
  378. default:
  379. {
  380. cout<<"Podano zla opcje";
  381. }
  382. }
  383. //zamknij plik to na końcu
  384. // fclose(bitmap_file);
  385. TrybTekstowy();
  386. return 0;
  387. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement