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)
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; 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 Tino: Code- durch Delphi-Tags ersetzt.