Kompresuję mapę bitową (24 bity) metodą RLE. Plik zajmujący ok. 4MB przed kompresją po kompresji zajmuje o. 1MB, natomiast gdy chcę go zdekompresować by móc go otworzyć plik po dekompresji zajmuje ok. 3,98MB i nie można go otworzyć.
Może ktoś z Was będzie w stanie mi pomóc.
Kompresja:
void kompresja (string sciezka)
{
ifstream otworz(sciezka, ios::binary);
int rozmiar;
otworz.seekg(0, ios::end);
rozmiar=otworz.tellg();
otworz.seekg(0, ios::beg);
int i=0;
ofstream kompresja("skompresowany.bmp", ios::binary);
for(i=0; i<54; i++)
{
char znak=otworz.get();
kompresja<<znak;
}
char TempA1, TempA2, TempA3, TempB1, TempB2, TempB3;
int licznik=1;
while(!otworz.eof())
{
int poz=otworz.tellg();
if(otworz.tellg()>56) otworz.seekg(poz-3, ios::beg); //Powrót o 3 pozycje, aby piksel TempA był pikselem TempB z wcześniejszego przebiegu
TempA1=otworz.get(); //Pixel1 R
TempA2=otworz.get(); //Pixel1 G
TempA3=otworz.get(); //Pixel1 B
TempB1=otworz.get(); //Pixel2 R
TempB2=otworz.get(); //Pixel2 B
TempB3=otworz.get(); //Pixel2 G
if((TempA1==TempB1)&&(TempA2==TempB2)&&(TempA3==TempB3)) licznik++;
else if(((TempA1!=TempB1)||(TempA2!=TempB2)||(TempA3!=TempB3)) && (licznik==1))
{
kompresja<<TempA1<<TempA2<<TempA3<<" ";
}
else if(((TempA1!=TempB1)||(TempA2!=TempB2)||(TempA3!=TempB3)) && (licznik>1))
{
kompresja<<TempA1<<TempA2<<TempA3<<"x"<<licznik<<" ";
licznik=1;
}
}
Dekompresja:
ifstream otworz(sciezka_wej, ios::binary);
ofstream dekompresowany(sciezka_wyj, ios::binary);
for(int i=0; i<54; i++)
{
char znak=otworz.get();
dekompresowany<<znak; //Nagłówek bitmapy
}
otworz.seekg(54, ios::beg);
char WartoscR, WartoscB, WartoscG,znak;
int ilosc, suma=0;
do
{
otworz>>WartoscR;
otworz>>WartoscG;
otworz>>WartoscB;
znak=otworz.get();
if(znak=='x')
{
otworz>>ilosc;
suma+=ilosc;
for(int i=0; i<ilosc; i++) dekompresowany<<WartoscR<<WartoscG<<WartoscB;
}
else {dekompresowany<<WartoscR<<WartoscG<<WartoscB; suma++;}
}while(!otworz.eof());