Advertisement
Guest User

Untitled

a guest
Jan 24th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.56 KB | None | 0 0
  1. #include "BitMapa.h"
  2.  
  3.  
  4. //wczytuje adres danych, liczbe bitow kolorow, i szerokosc
  5. int BitMapa::WczytajPlik(char NazwaPliku[50])
  6. {
  7. int Znak;
  8.  
  9. //Otwiera pliku z bitmapa
  10. Plik = fopen(NazwaPliku, "rb");
  11. if (Plik == NULL)
  12. {
  13. return(0);
  14. }
  15. //Przechodzi do 10 bajtu i odczytuje adres obszaru danych (4 bajty)
  16. fseek(Plik, 10, SEEK_SET);
  17.  
  18. //Tworzy 4 jednobajtowe liczby
  19. Bajt *raz = new Bajt(8);
  20. Bajt *dwa = new Bajt(8);
  21. Bajt *trzy = new Bajt(8);
  22. Bajt *cztery = new Bajt(8);
  23.  
  24. //Wczytuje 4 kolejne bajty
  25. Znak = getc(Plik);
  26. raz->Wartosc = Znak;
  27. Znak = getc(Plik);
  28. dwa->Wartosc = Znak;
  29. Znak = getc(Plik);
  30. trzy->Wartosc = Znak;
  31. Znak = getc(Plik);
  32. cztery->Wartosc = Znak;
  33.  
  34. //Tworzy 32-bitowa liczbe z powyzszych bajtow
  35. Bajt *Dane = new Bajt(32);
  36. Dane->Zamien(*raz, *dwa, *trzy, *cztery);
  37. Dane->Dziesietne();
  38.  
  39. AdresDanych = Dane->Wartosc;
  40.  
  41. //Przechodzi do 18 bajtu i odczytaje szerokosc
  42. fseek(Plik, 18, SEEK_SET);
  43.  
  44. Znak = getc(Plik);
  45. raz->Wartosc = Znak;
  46. Znak = getc(Plik);
  47. dwa->Wartosc = Znak;
  48. Znak = getc(Plik);
  49. trzy->Wartosc = Znak;
  50. Znak = getc(Plik);
  51. cztery->Wartosc = Znak;
  52.  
  53. Dane->Zamien(*raz, *dwa, *trzy, *cztery);
  54. Dane->Dziesietne();
  55.  
  56. Szerokosc = Dane->Wartosc;
  57.  
  58. //Przechodzi do 34 bajtu i odczytuje dlugosc obszaru danych(4 bajty)
  59. fseek(Plik, 34, SEEK_SET);
  60.  
  61. Znak = getc(Plik);
  62. raz->Wartosc = Znak;
  63. Znak = getc(Plik);
  64. dwa->Wartosc = Znak;
  65. Znak = getc(Plik);
  66. trzy->Wartosc = Znak;
  67. Znak = getc(Plik);
  68. cztery->Wartosc = Znak;
  69.  
  70. //Tworzy 32-bitowa liczbe
  71. Dane->Zamien(*raz, *dwa, *trzy, *cztery);
  72. Dane->Dziesietne();
  73.  
  74. RozmiarDanych = Dane->Wartosc;
  75.  
  76. //Usuwa niepotrzebne juz obiekty
  77. delete raz;
  78. delete dwa;
  79. delete trzy;
  80. delete cztery;
  81. delete Dane;
  82.  
  83. return(1);
  84. }
  85.  
  86. //odczytuje z bitmapy tekst
  87. void BitMapa::Odczytaj(char* PlikZTekstem)
  88. {
  89. int PozycjaWDanych = 0;
  90. int OdczytanyZnak = 0;
  91. int Przeczytane = 0;
  92.  
  93. //Zera nieznaczace-reszta z dzielenia szerokosci przez 4
  94. // znajduja sie na koncu lini
  95. int ZeraNieznaczace = Szerokosc % 4;
  96.  
  97. Bajt *bajtZnaku = new Bajt(8);
  98. Bajt *bajtTymczasowy = new Bajt(8);
  99. int licznikBitow = 0;
  100.  
  101. //Ustawia kursor danych za naglowkiem bitmapy
  102. fseek(Plik, BitMapa::AdresDanych, SEEK_SET);
  103.  
  104. //pobiera dlugosc tekstu ukrytego w bitmapie
  105. RozmiarTekstu = getc(Plik);
  106.  
  107. //Czyta plik do momentu, w którym PozycjaWDanych jest mniejsza od rozmiaru danych
  108. //zeby nie przekroczyc pamieci
  109. while (PozycjaWDanych < RozmiarTekstu * 8)
  110. {
  111. OdczytanyZnak = getc(Plik);
  112. Przeczytane++;
  113. if (Przeczytane <= Szerokosc)
  114. {
  115. bajtZnaku->Wartosc = OdczytanyZnak;
  116. bajtZnaku->Binarne();
  117. bajtTymczasowy->Bity[licznikBitow] = bajtZnaku->Bity[7];
  118. licznikBitow++;
  119.  
  120. //Mamy bajt wiec przeksztalca go w tekst
  121. if (licznikBitow == 8)
  122. {
  123. licznikBitow = 0;
  124. bajtTymczasowy->Dziesietne();
  125. std::cout << (char)(bajtTymczasowy->Wartosc);
  126. }
  127. }
  128.  
  129. if (Przeczytane == Szerokosc + ZeraNieznaczace)
  130. {
  131. Przeczytane = 0;
  132. }
  133. PozycjaWDanych++;
  134. }
  135.  
  136. //Usuwa obiekty
  137. delete bajtZnaku;
  138. delete bajtTymczasowy;
  139. fclose(Plik);
  140. return;
  141.  
  142. }
  143.  
  144. //Tworzy bitmape z ukrytym tekstem
  145. int BitMapa::Kopiuj(char NowaBitmapa[10], char PlikTekstowy[10])
  146. {
  147.  
  148. FILE *DrugiPlik;
  149. int znak;
  150. int Koniec = 0;
  151. int k = 0;
  152. int Znak;
  153. int Przeczytane = 0;
  154. int BitZnaku = 0;
  155. int ZnakTekstu;
  156.  
  157. int ZeraNieznaczace = Szerokosc % 4;
  158.  
  159. Bajt *bajt = new Bajt(8);
  160. Bajt *bajtZnaku = new Bajt(8);
  161.  
  162. //Otwiera plik z tekstem
  163. Tekst = fopen(PlikTekstowy, "rt+");
  164.  
  165. //Odczytuje jego rozmiar i wraca na poczatek pliku
  166. RozmiarTekstu = fseek(Tekst, 0L, SEEK_END);
  167. RozmiarTekstu = ftell(Tekst);
  168. fseek(Tekst, 0L, SEEK_SET);
  169.  
  170. //sprawdza czy ilosci pikseli wystarczy do ukrycia tekstu
  171. if ((RozmiarTekstu + 1) * 8 > RozmiarDanych)
  172. {
  173. return(0);
  174. }
  175. //tworzy druga bitmape w trybie binarnym do zapisu
  176. DrugiPlik = fopen(NowaBitmapa, "wb");
  177.  
  178. //Wraca na poczatek pierwszej bitmapy
  179. fseek(Plik, 0L, SEEK_SET);
  180.  
  181. //przepisuje naglowek oryginalnej bitmapy(az do obszaru danych)
  182. do
  183. {
  184. znak = getc(Plik);
  185. if (k < AdresDanych)
  186. {
  187. putc(znak, DrugiPlik);
  188. }
  189. k++;
  190. } while (k < AdresDanych);
  191.  
  192. //zapisuje dlugosc tekstu i wstawia po naglowku nowej bitmapy
  193. putc(RozmiarTekstu, DrugiPlik);
  194.  
  195. //przepisuje kolejne bajty obszaru danych zmieniajac ostatni
  196. //bit kazdego koloru
  197. k = 0;
  198. while (k != RozmiarDanych)
  199. {
  200. if ((BitZnaku == 0))
  201. {
  202. if (Przeczytane < Szerokosc)
  203. {
  204. ZnakTekstu = getc(Tekst);
  205. }
  206.  
  207. bajtZnaku->Wartosc = ZnakTekstu;
  208. bajtZnaku->Binarne();
  209.  
  210. }
  211.  
  212. //pobiera bajt z oryginalnej bitmapy
  213. znak = getc(Plik);
  214. Przeczytane++;
  215.  
  216. //jak nie wkroczyl w obszar zer nieznaczacych i tekst sie jeszcze nie skoczyl
  217. if ((Przeczytane <= Szerokosc) && Koniec == 0)
  218. {
  219. bajt->Wartosc = znak;
  220. bajt->Binarne();
  221.  
  222. //zamienia ostatni bit na kolejny bit bajtu tekstu
  223. bajt->UstawBit(bajtZnaku->Bity[BitZnaku]);
  224. BitZnaku++;
  225.  
  226. if (BitZnaku == 8)
  227. {
  228. BitZnaku = 0;
  229. if (bajtZnaku->Wartosc == 0)
  230. {
  231. Koniec = 1;
  232. }
  233. }
  234. bajt->Dziesietne();
  235.  
  236. //zapisuje zmodyfikowany bajt do nowej bitmapy
  237. znak = bajt->Wartosc;
  238. putc(znak, DrugiPlik);
  239. }
  240. else
  241. {
  242. //jak tekst sie juz skonczyl lub wkroczyl w obszar zer nieznaczacych
  243. //to przepisz bajt nie zmieniajac go
  244. putc(znak, DrugiPlik);
  245. }
  246. if (Przeczytane == Szerokosc + ZeraNieznaczace)
  247. {
  248. Przeczytane = 0;
  249. }
  250. k++;
  251. }
  252.  
  253. //usun obiekty i zamknij zmodyfikowana bitmape
  254. delete bajt;
  255. delete bajtZnaku;
  256. fclose(DrugiPlik);
  257.  
  258. return 1;
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement