Autor Beitrag
Mike_C
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 207

Win XP
D7 Enterprise
BeitragVerfasst: So 27.04.03 11:59 
Dieses tutorial (mein erstes), soll zeigen, wie man die Huffman Funktionen zum Komprimieren und Dekomprimieren verwenden kann. Ich verzeichte auf die Erklärungen zu Huffman, da sie nicht ganz leicht zu erlkären sind.

wir brauchen folgendes:

eine Unit (HuffFuncs.pas), die man sich hier download kann (www.howtodothings.co...icle.asp?article=313)

eine Unit, die wir uns selbst schreiben (reine vereinfachung)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
unit CompDecomp;

interface

uses
  SysUtils;

procedure CompressText(const filein, fileout: string); 
procedure DecompressText(const Filein, FileOut: string);
implementation

uses HuffFuncs;

procedure CompressText(const filein, fileout: string);
var size1, size2: integer;
begin
  Initialize;
  SetInputfile(FileIn);
  SetOutputFile(FileOut);
  Compress(size1, size2);
  Finalize;
end;

procedure DecompressText(const Filein, FileOut: string); 
begin
  Initialize;
  SetOutputFile(FileOut);
  SetInputfile(FileIn);
  Decompress;
  Finalize;
end;

end.


Auf unserer Mainform brauchen wir ein Memo und 2 Buttons, einen openDialog und einen SaveDialog

Unser Button1 soll den Text im Memo komprimiert speichern

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if SaveDialog1.Execute then begin
    Memo1.Lines.SaveToFile(SaveDialog1.Filename);
    CompressText(SaveDialog1.Filename, SaveDialog1.Filename+'.comp');
  end;
  //wenn wir nur ein file haben wollen, brauchen wir noch das hier:
  DeleteFile(SaveDialog1.Filename);
  RenameFile(SaveDialog1.Filename+'.comp', SaveDialog1.Filename);
  if FileExists(SaveDialog1.Filename+'.comp'then 
     DeleteFile(SaveDialog1.Filename);

end;


unser Button2 soll einen komprimierten Text dekomprimieren und in unser Memo schreiben...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button2Click(Sender: TObject);
begin 
  if OpenDialog1.Execute then begin
     DecompressText(OpenDialog1.Filename, OpenDialog1.Filename+'.decomp');
     DeleteFile(OpenDialog1.Filename);
     RenameFile(OpenDialog1.Filename+'.decomp', OpenDialog1.Filename);
     if FileExists(OpenDialog1.Filename+'.decomp'then

       DeleteFile(OpenDialog1.Filename+'.decomp);

     Memo1.Lines.LoadFromFile(OpenDialog1.Filename);
  end;
end;


Zur Erlkärung soll noch soviel gesagt sein:

man muss immer mit 2 Dateien arbeiten (und hinterher eine löschen), weil Huffman etwa so vorgeht:

Es wird eine Datei eingelesen (filein) und nach dem Huffman-Baum-Prinzip komprimiert, oder dekomprmiert. Die Ergebnisse werden in ein zweites File geschrieben (fileout). Da man letztendlich nur auf die ergebnisse scharf ist, wird man filein löschen und fileout behalten. Damit normale dateinamen zustande kommen, müssen nun noch die dateinamen von filein und fileout vertauscht werden, das machen wir über RenameFile.

Viel Spaß beim Ausprobieren...

(Ein Listing der Huffman-Funktionen gibt es im Tutorial "Huffman Kompression Teil II - allerdings ohne Erklärung!)

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.

_________________
Life is, what some people call a mystery. To me life's just a lesson, you're learning when you're through. So why do we try to understand?
Ivo@CoMRoK
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 258

Win XP
D3 Prof., D7 Pe.
BeitragVerfasst: Mo 01.05.06 21:34 
Ähm der Link funzt bei mir nicht :!: .
Vielleicht könntest du die Unit ja einfach als Anhang hochladen - wär echt nett - :D .

_________________
Fällt der Bauer tot vom Traktor, stand am Waldrand ein Reaktor.
Ein altes indianisches Sprichwort besagt:Es kann gefährlich sein gelben Schnee zu essen.