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 »  |