Kompresja i dekompresja bitmapy
Ostatnio zmodyfikowano 2013-06-15 21:38
Skeetch Temat założony przez niniejszego użytkownika |
Kompresja i dekompresja bitmapy » 2013-06-11 14:54:57 Kompresuję bitmapę metodą rle. Jest to bitmapa 24 bitowa, więc żeby ją otworzyć po kompresji, muszę ją zdekompresować. O ile z samą kompresją nie ma większych problemów, to podczas dekompresji pętla while(!plik.eof()) nigdy się nie kończy. Jeśli zamknę program "z buta" to bitmapę można otworzyć i jest wszystko ok, z tym że jej rozmiar zależy od czasu działania tego programu. Po kilku minutach bitmapa zajmuje już ponad 150MB, a powinna zajmować ok 4MB. Kod do dekompresji: void dekompresja( string sciezka_wej, string sciezka_wyj ) { 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; } otworz.seekg( 54, ios::beg ); char WartoscR, WartoscB, WartoscG, znak; int ilosc; while( !otworz.eof() ) { if( suma == bmp.bmWidth * bmp.bmHeight * 3 ) break; otworz >> WartoscR; otworz >> WartoscB; otworz >> WartoscG; znak = otworz.get(); if( znak == 'x' ) { otworz >> ilosc; for( int i = 0; i < ilosc; i++ ) dekompresowany << WartoscR << WartoscB << WartoscG; } else dekompresowany << WartoscR << WartoscB << WartoscG; } } |
|
DejaVu |
» 2013-06-15 21:38:19 Wystarczy, że ta linijka się nie powiedzie, a eof nigdy nie zajdzie. O ile mnie pamięć nie zawodzi to wszelkie wartości w pliku bmp są zapisane w postaci 4 bajtów (int), a nie cyfr po których występuje spacja. |
|
« 1 » |