Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kompresja i dekompresja bitmapy

Ostatnio zmodyfikowano 2013-06-15 21:38
Autor Wiadomość
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:
C/C++
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;
       
    }
}
P-85380
DejaVu
» 2013-06-15 21:38:19
C/C++
otworz >> ilosc;
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.
P-85656
« 1 »
  Strona 1 z 1