Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "BitMapa.h"
- //wczytuje adres danych, liczbe bitow kolorow, i szerokosc
- int BitMapa::WczytajPlik(char NazwaPliku[50])
- {
- int Znak;
- //Otwiera pliku z bitmapa
- Plik = fopen(NazwaPliku, "rb");
- if (Plik == NULL)
- {
- return(0);
- }
- //Przechodzi do 10 bajtu i odczytuje adres obszaru danych (4 bajty)
- fseek(Plik, 10, SEEK_SET);
- //Tworzy 4 jednobajtowe liczby
- Bajt *raz = new Bajt(8);
- Bajt *dwa = new Bajt(8);
- Bajt *trzy = new Bajt(8);
- Bajt *cztery = new Bajt(8);
- //Wczytuje 4 kolejne bajty
- Znak = getc(Plik);
- raz->Wartosc = Znak;
- Znak = getc(Plik);
- dwa->Wartosc = Znak;
- Znak = getc(Plik);
- trzy->Wartosc = Znak;
- Znak = getc(Plik);
- cztery->Wartosc = Znak;
- //Tworzy 32-bitowa liczbe z powyzszych bajtow
- Bajt *Dane = new Bajt(32);
- Dane->Zamien(*raz, *dwa, *trzy, *cztery);
- Dane->Dziesietne();
- AdresDanych = Dane->Wartosc;
- //Przechodzi do 18 bajtu i odczytaje szerokosc
- fseek(Plik, 18, SEEK_SET);
- Znak = getc(Plik);
- raz->Wartosc = Znak;
- Znak = getc(Plik);
- dwa->Wartosc = Znak;
- Znak = getc(Plik);
- trzy->Wartosc = Znak;
- Znak = getc(Plik);
- cztery->Wartosc = Znak;
- Dane->Zamien(*raz, *dwa, *trzy, *cztery);
- Dane->Dziesietne();
- Szerokosc = Dane->Wartosc;
- //Przechodzi do 34 bajtu i odczytuje dlugosc obszaru danych(4 bajty)
- fseek(Plik, 34, SEEK_SET);
- Znak = getc(Plik);
- raz->Wartosc = Znak;
- Znak = getc(Plik);
- dwa->Wartosc = Znak;
- Znak = getc(Plik);
- trzy->Wartosc = Znak;
- Znak = getc(Plik);
- cztery->Wartosc = Znak;
- //Tworzy 32-bitowa liczbe
- Dane->Zamien(*raz, *dwa, *trzy, *cztery);
- Dane->Dziesietne();
- RozmiarDanych = Dane->Wartosc;
- //Usuwa niepotrzebne juz obiekty
- delete raz;
- delete dwa;
- delete trzy;
- delete cztery;
- delete Dane;
- return(1);
- }
- //odczytuje z bitmapy tekst
- void BitMapa::Odczytaj(char* PlikZTekstem)
- {
- int PozycjaWDanych = 0;
- int OdczytanyZnak = 0;
- int Przeczytane = 0;
- //Zera nieznaczace-reszta z dzielenia szerokosci przez 4
- // znajduja sie na koncu lini
- int ZeraNieznaczace = Szerokosc % 4;
- Bajt *bajtZnaku = new Bajt(8);
- Bajt *bajtTymczasowy = new Bajt(8);
- int licznikBitow = 0;
- //Ustawia kursor danych za naglowkiem bitmapy
- fseek(Plik, BitMapa::AdresDanych, SEEK_SET);
- //pobiera dlugosc tekstu ukrytego w bitmapie
- RozmiarTekstu = getc(Plik);
- //Czyta plik do momentu, w którym PozycjaWDanych jest mniejsza od rozmiaru danych
- //zeby nie przekroczyc pamieci
- while (PozycjaWDanych < RozmiarTekstu * 8)
- {
- OdczytanyZnak = getc(Plik);
- Przeczytane++;
- if (Przeczytane <= Szerokosc)
- {
- bajtZnaku->Wartosc = OdczytanyZnak;
- bajtZnaku->Binarne();
- bajtTymczasowy->Bity[licznikBitow] = bajtZnaku->Bity[7];
- licznikBitow++;
- //Mamy bajt wiec przeksztalca go w tekst
- if (licznikBitow == 8)
- {
- licznikBitow = 0;
- bajtTymczasowy->Dziesietne();
- std::cout << (char)(bajtTymczasowy->Wartosc);
- }
- }
- if (Przeczytane == Szerokosc + ZeraNieznaczace)
- {
- Przeczytane = 0;
- }
- PozycjaWDanych++;
- }
- //Usuwa obiekty
- delete bajtZnaku;
- delete bajtTymczasowy;
- fclose(Plik);
- return;
- }
- //Tworzy bitmape z ukrytym tekstem
- int BitMapa::Kopiuj(char NowaBitmapa[10], char PlikTekstowy[10])
- {
- FILE *DrugiPlik;
- int znak;
- int Koniec = 0;
- int k = 0;
- int Znak;
- int Przeczytane = 0;
- int BitZnaku = 0;
- int ZnakTekstu;
- int ZeraNieznaczace = Szerokosc % 4;
- Bajt *bajt = new Bajt(8);
- Bajt *bajtZnaku = new Bajt(8);
- //Otwiera plik z tekstem
- Tekst = fopen(PlikTekstowy, "rt+");
- //Odczytuje jego rozmiar i wraca na poczatek pliku
- RozmiarTekstu = fseek(Tekst, 0L, SEEK_END);
- RozmiarTekstu = ftell(Tekst);
- fseek(Tekst, 0L, SEEK_SET);
- //sprawdza czy ilosci pikseli wystarczy do ukrycia tekstu
- if ((RozmiarTekstu + 1) * 8 > RozmiarDanych)
- {
- return(0);
- }
- //tworzy druga bitmape w trybie binarnym do zapisu
- DrugiPlik = fopen(NowaBitmapa, "wb");
- //Wraca na poczatek pierwszej bitmapy
- fseek(Plik, 0L, SEEK_SET);
- //przepisuje naglowek oryginalnej bitmapy(az do obszaru danych)
- do
- {
- znak = getc(Plik);
- if (k < AdresDanych)
- {
- putc(znak, DrugiPlik);
- }
- k++;
- } while (k < AdresDanych);
- //zapisuje dlugosc tekstu i wstawia po naglowku nowej bitmapy
- putc(RozmiarTekstu, DrugiPlik);
- //przepisuje kolejne bajty obszaru danych zmieniajac ostatni
- //bit kazdego koloru
- k = 0;
- while (k != RozmiarDanych)
- {
- if ((BitZnaku == 0))
- {
- if (Przeczytane < Szerokosc)
- {
- ZnakTekstu = getc(Tekst);
- }
- bajtZnaku->Wartosc = ZnakTekstu;
- bajtZnaku->Binarne();
- }
- //pobiera bajt z oryginalnej bitmapy
- znak = getc(Plik);
- Przeczytane++;
- //jak nie wkroczyl w obszar zer nieznaczacych i tekst sie jeszcze nie skoczyl
- if ((Przeczytane <= Szerokosc) && Koniec == 0)
- {
- bajt->Wartosc = znak;
- bajt->Binarne();
- //zamienia ostatni bit na kolejny bit bajtu tekstu
- bajt->UstawBit(bajtZnaku->Bity[BitZnaku]);
- BitZnaku++;
- if (BitZnaku == 8)
- {
- BitZnaku = 0;
- if (bajtZnaku->Wartosc == 0)
- {
- Koniec = 1;
- }
- }
- bajt->Dziesietne();
- //zapisuje zmodyfikowany bajt do nowej bitmapy
- znak = bajt->Wartosc;
- putc(znak, DrugiPlik);
- }
- else
- {
- //jak tekst sie juz skonczyl lub wkroczyl w obszar zer nieznaczacych
- //to przepisz bajt nie zmieniajac go
- putc(znak, DrugiPlik);
- }
- if (Przeczytane == Szerokosc + ZeraNieznaczace)
- {
- Przeczytane = 0;
- }
- k++;
- }
- //usun obiekty i zamknij zmodyfikowana bitmape
- delete bajt;
- delete bajtZnaku;
- fclose(DrugiPlik);
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement