Entwickler-Ecke

Delphi Tutorials - Huffman-Kompression Teil I


Mike_C - So 27.04.03 11:59
Titel: Huffman-Kompression Teil I
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 (http://www.howtodothings.com/showarticle.asp?article=313)

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


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


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


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.


Ivo@CoMRoK - 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 .