Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » hilfe bei meine projekt.. bmp komprimieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.10.2003, 10:39 Uhr
~devil_78
Gast


hi ihr code gurus,
ich hab ein kleines problem, ich muss projekt ein kleines komprimierungs und dekomprimierungsprogramm schreiben das bmp und text (andre auch) komprimieren soll..

Das Verfahren:
Bei dem Verfahren werden die Zeichen byteweise eingelesen und gezählt. Folgen mehr als 3 gleiche Zeichen aufeinander, so werden sie gegen ein [Schlüsselzeichen], einen[Zähler] und das mehrfach vorkommende [Zeichen] ersetzt.
Das Schlüsselzeichen wird für den Expander in die Datei geschrieben um ihm zu sagen, dass eine Ausnahme folgt und er sich dem Zähler entsprechend verhalten soll.

so das als kleine anleitung :-) und nu zu meinen problem...

ich kann zwar textdateien komprimieren und auch wieder entpacken aber beim komprimieren von bmp´s gibs fehler :-(

ich kann die einfach nicht wieder entpacken...

so und hier mal ein code... ich hoffe ihr könnt mir helfen


C/C++ Code:

C++:
void CRled3Dlg::Komprimieren(CFile &QuellDatei, CFile &ZielDatei)
{
    unsigned char cZeichen;
    unsigned char cNaechstesZeichen;
    unsigned char cZaehler = (unsigned char)1;
    unsigned char cEsc = (unsigned char)0x90;
    unsigned char cTempEsc = (unsigned char)0x0;
    int nEscWechsel = 1024;
    int nZaehlerBytes = 1;

    //Header in Zieldatei schreiben
    unsigned char cHeader[4]  ={'R','L','3',(unsigned char)0x90};
    ZielDatei.Write(cHeader,4);

    if (QuellDatei.Read(&cZeichen,1))
    {
        //solange lesen wie ein Zeichen gefunden wird
        while (QuellDatei.Read (&cNaechstesZeichen,1))
        {
            nZaehlerBytes++;

            if (cZeichen == cEsc)
            {
                ZielDatei.Write(&cEsc,1);
                ZielDatei.Write(&cTempEsc,1);
                cZaehler = 1;
                cZeichen = cNaechstesZeichen;
            }
            else
            {
                if(cZeichen == cNaechstesZeichen && cZaehler < 255)
                {
                    cZaehler++;

                }
                else
                {
                    if ((int)cZaehler > 3)
                    {
                        ZielDatei.Write(&cEsc,1);
                        ZielDatei.Write(&cZaehler,1);
                        ZielDatei.Write(&cZeichen,1);
                        cZaehler = (unsigned char)1;
                        cZeichen = cNaechstesZeichen;
                    }
                    else
                    {
                        for (int nI = 0; nI < (int)cZaehler; nI++)
                        {
                            ZielDatei.Write(&cZeichen,1);
                        }
                        cZaehler = (unsigned char)1;
                        cZeichen = cNaechstesZeichen;

                    }

                }

            }

        }// Ende while (QuellDatei.Read (&cNaechstesZeichen,1)

        if (cZaehler > 3)
        {
            ZielDatei.Write(&cEsc,1);
            ZielDatei.Write(&cZaehler,1);
            ZielDatei.Write(&cZeichen,1);
            cZaehler = 1;
            cZeichen = cNaechstesZeichen;
            
        }
        else
        {
            for (int nI = 0; nI < cZaehler; nI++)
            {
                ZielDatei.Write(&cZeichen,1);
            }
        }


    }//ende if (QuellDatei.Read(&cZeichen,1)



}


edit by virtual: code tags eingefügt

Dieser Post wurde am 29.10.2003 um 11:02 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.10.2003, 11:10 Uhr
virtual
Sexiest Bit alive
(Operator)


Der Algo kommt mir nicht richtig implemtiert vor. Nehmen wir mal an, Du hast eine Datei, wo folgende Zeichen dring stehen "AAEAA", wobei "E" das EscapeZeichen ist. Meiner Meinung nach macht Dein Programm dann folgendes:
1. Es findet die beiden As, schreibt nach cZähler eine 2 und merkt sich das Zeichen; allerdings wird nichts in die Ausgabedatei geschriebem
2. Es findet dann das Esacpe Zeichen, schreibt nun unmittelbar die das Esacpte ESC Zeichen,
3. Schreibt nun die beiden As, die es im ersten Schritt gefunden hat, also bereits hier an der falschen Stelle,
4. Schreibt nun die letzten beiden As
Oder liege ich falsch?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.10.2003, 12:52 Uhr
(un)wissender
Niveauwart


Wenn es um große Textdateien geht:
Mach eine Tabelle mit Worten und deren Code.
Statt der Wörter speicherst du jetzt nur den Code bei der Komprimierung, bei der Dekomprimierung erstetzt du den Code mit den Wörter.
Als Code(Schlüssel)recht, denke ich, 16Bit, da es wohl nicht mehr als 65.536 unterschiedliche Wörter in einer Sprache gibt.
Will heißen: Jedes "Wort" ist nur noch 2byte groß.
(Tabellenplatz kommt noch dazu, klar, ist aber nicht sooo viel).
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: