Membuat Tool Kompresi File Pake Delphi + ZLIB

Dari laporan WordPress, beberapa pengunjung blog saya melakukan pencarian ‘source code kompresi file dengan Delphi’. Kelanjutannya, kini saya menulis sebuah tutorial tentang kompresi file dengan Delphi. Tutorial ini menggunakan Delphi 6 dan sebuah library open source ZLIB untuk implementasi kompresi menggunakan metode ZLIB.

Instalasi ZLIB Compression Library

Langkah pertama, silahkan Anda download ZLIB Compression Library bersama source code aplikasi yang saya demokan ini di akhir tulisan ini. Kemudian ekstraklah ke sebuah folder, misalnya di C:\ZlibEx. Selanjutnya tambahkan folder C:\ZlibEx ke Library Path Delphi melalui menu Tools>Environment Options. Pada dialog yang muncul, klik tab Library, dan klik tombol elipsis di samping kanan combobox Library path. Dialog Directories akan muncul.

Klik tombol elipsis yang dilingkari, pilih folder C:\ZlibEx di mana Anda meletakkan ZLIB Compression Library hasil ekstraksi. Tombol Add akan menjadi aktif. Klik Tombol Add, kemudian klik OK. Kembali ke dialog Environment Options. Klik OK lagi.

Mengimplementasikan ZLIB dalam kode

Kita lanjut dengan pembuatan aplikasi kompresi file.

1.    Buat sebuah aplikasi baru. Simpanlah file-file aplikasi dalam satu folder.
2.    Pada form utama, tambahkan dua buah editbox, dua buah label dan 3 buah button. Tambahkan juga sebuah OpenDialog dan sebuah SaveDialog.
Sebagai perbandingan, berikut rancangan form saya.

3.    Pindah ke kode (F12). Untuk menggunakan ZLIB, Anda harus menambahkan unit ZlibEx.pas ke klausa uses.

implementation
{$R *.dfm}

uses ZlibEX;

4.    Kini kita masukkan kode untuk memilih file yang akan dikompres dan memasukkannya ke Edit1. Demikian juga dengan file target di mana hasil kompresi akan disimpan.

procedure TFMain.BitBtn1Click(Sender: TObject);
begin
if opendialog1.Execute then
Edit1.Text:=opendialog1.FileName;
end;

procedure TFMain.BitBtn2Click(Sender: TObject);
begin
if Savedialog1.Execute then
Edit2.Text:=SaveDialog1.FileName;
end;

5.    Terakhir, kita buat kode untuk mengompres file sumber dan menyimpan hasilnya ke file target.

procedure TFMain.SpeedButton1Click(Sender: TObject);
var
F1: TFileStream;
sz1, sz2: Integer;
p1, p2: Pointer;
ratio: real;
begin
//baca file sumber ke memori
f1:=TFileStream.Create(edit1.Text, fmOpenRead);
sz1:=f1.Size;
Getmem(p1,sz1);
f1.Seek(0, soFromBeginning);
f1.Read(p1^, sz1);
f1.Free;
//mulai dengan kompresi
p2:=nil;
ZCompress(p1, sz1, p2, sz2, zcMax);
Freemem(P1, sz1);
//Simpan hasil kompresi ke File target
F1:=TFileStream.Create(Edit2.Text, fmCreate);
f1.Write(p2^, sz2);
f1.Free;
FreeMem(p2, sz2);
//hitung perbandingan ukuran file
ratio:= ((sz1 - sz2)/sz1) * 100;
lblResult.Caption:=
'Ukuran File Sumber:'#13+IntToStr(sz1)+'Bytes.'#13+
'Ukuran File Target (hasil kompresi):'#13+IntToStr(sz2)+'Bytes.'#13+
'Rasio Kompresi:'#13+FormatFloat('0.00', ratio)+'%.'#13#13+
'Kompresi selesai.';
end;

6.    Save projek Anda dan jalankan dengan menekan F9. Jika semuanya beres, tampilan aplikasi Anda akan seperti ini:

Dan berikut, snapshot ketika kompresi telah selesai.

Kode Selengkapnya

unit umain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons;

type
TFMain = class(TForm)
Shape1: TShape;
Bevel1: TBevel;
Label1: TLabel;
Label2: TLabel;
Image1: TImage;
Label3: TLabel;
Edit1: TEdit;
Label4: TLabel;
Edit2: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
SpeedButton1: TSpeedButton;
GroupBox1: TGroupBox;
lblResult: TLabel;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Label5: TLabel;
Label6: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure Label6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FMain: TFMain;

implementation

{$R *.dfm}

uses ZlibEX, ShellAPI;

procedure TFMain.BitBtn1Click(Sender: TObject);
begin
if opendialog1.Execute then
Edit1.Text:=opendialog1.FileName;
end;

procedure TFMain.BitBtn2Click(Sender: TObject);
begin
if Savedialog1.Execute then
Edit2.Text:=SaveDialog1.FileName;
end;

procedure TFMain.Edit1Change(Sender: TObject);
begin
SpeedButton1.Enabled:=FileExists(edit1.Text);
if SpeedButton1.Enabled then
Edit2.Text:=ChangeFileExt(edit1.Text, '.zlib')
else
Edit2.Text:='Pilih Target File Hasil kompresi...';
end;

procedure TFMain.FormCreate(Sender: TObject);
begin
Edit1.Text:='Pilih File Yang Akan Dikompress...';
end;

procedure TFMain.SpeedButton1Click(Sender: TObject);
var
F1: TFileStream;
sz1, sz2: Integer;
p1, p2: Pointer;
ratio: real;
begin
//baca file sumber ke memori
f1:=TFileStream.Create(edit1.Text, fmOpenRead);
sz1:=f1.Size;
Getmem(p1,sz1);
f1.Seek(0, soFromBeginning);
f1.Read(p1^, sz1);
f1.Free;
//mulai dengan kompresi
p2:=nil;
ZCompress(p1, sz1, p2, sz2, zcMax);
Freemem(P1, sz1);
//Simpan hasil kompresi ke File target
F1:=TFileStream.Create(Edit2.Text, fmCreate);
f1.Write(p2^, sz2);
f1.Free;
FreeMem(p2, sz2);
//hitung perbandingan ukuran file
ratio:= ((sz1 - sz2)/sz1) * 100;
lblResult.Caption:=
'Ukuran File Sumber:'#13+IntToStr(sz1)+'Bytes.'#13+
'Ukuran File Target (hasil kompresi):'#13+IntToStr(sz2)+'Bytes.'#13+
'Rasio Kompresi:'#13+FormatFloat('0.00', ratio)+'%.'#13#13+
'Kompresi selesai.';
end;

procedure TFMain.Label6Click(Sender: TObject);
begin
ShellExecute(handle, 'open', PChar(TLabel(Sender).caption),nil, nil, SW_SHOW)
end;

end.


Download

Download contoh aplikasi 332KB [ sudah menyertakan ZLIB Compression Library]

Download Binary – 230KB
Download Source – 60KB

Download Binary – 230KB
Download Source – 60KB

Dan seperti biasa, Anda harus mengubah ekstensi file hasil download dari .PPT ke .ZIP. Pastikan Anda terhindar dari ancaman virus, trojan dan sebagainya. Silahkan pindai dulu file-file hasil download dengan antivirus sebelum dijalankan.

59 thoughts on “Membuat Tool Kompresi File Pake Delphi + ZLIB

  1. Mas.. Kalo kompresi pake VCLZip gimana ya? Bisa kasih contoh ga.. JIka bs, tlg kasih tau ke imel saya yaa.. makasih bgt sebelumnya…

    • Sorry banget Mas Rudi, baru balas.

      VCLZip bukanlah freeware/open source, jadi saya ga bisa buatkan contohnya. Mohon maaf, jika yang Anda minta selain VCLZip, seperti CabMan, 7Zip, saya bisa buatkan contohnya🙂

  2. aslm,mas saya lagi bingung!!sekarang saya lgi ngerjakan tugas akhir dengan topik analisa optimasi teknik kompresi huffman code dengan burrows wheeler dan move to front.kalo adasource code dengan dengan delphi saya minta mas tolong dikirim ke email saya beadawiyah @yahoo.co.id, saya mengerjakan sudah sampai kompresinya dari text input burrows wheeler untuk yang lainnya masih errror saya dah bingung………………..mhon bantuannya……..semoga ALLah membalas baik mas terimakasih

  3. Mas, aku mau nanya. Bagaimana cara membuat backup data MySQL melalui SCRIPT di DELPHI. Atau, apakah ada perintah di MySQL yang berfungsi/digunakan untuk membuat backup, baik data base atau tabel-tabelnya. Trusss, repair table efektif ga??

    • Backup dilakukan dari sisi server.
      Untuk backup dari klien, Anda harus meload semua data dan mengekspornya ke disk lokal, termasuk SQL untuk membuat tabel dan database. Setau saya, backup via script dari sisi klien tidak didukung.

  4. OYA, untuk file download ZEOS, aku dah download lebih dari 5 kali. Udah aku rename bolak balik dari RAR ke ZIP dan sebaliknya. Tetap aja pas di extract selalu CORRUPTED ARCHIVE..

  5. Bro, saya mau buat Kompresi exe ( semacam UPX ) bisa minta tolong source codenya? dan cara kerja kompresi ini
    menyimpan file ke memory RAM. thanks

  6. Mas sy mw nanya nih..
    Gini mas,sy sudah kompres file dengan tool kompresi yg mas bwt,tp gimana caranya membuka kembali file yg sudah dikompres itu mas????
    thanks..

  7. boz..saat ini saya telah membuat program kompresi data dengan huffman..tetapi hanya bisa single file…gmana caranya agar bisa multi file..mohon bantuan nya…bisa email..thks

  8. soory..saya masih kurang mengerti..apa bisa saya minta bantuannya..saya akan mengirimkan program saya..mungkin boz bisa bantu modif..supaya bisa multi file…thks sebelumnya

  9. gimana boz..udah ada tanggapan email saya??oh ya..kenapa y kl huffman saya kompresi file selaen file teks malahan ngaco??mohon diberi pencerahan…

  10. Mas..saya sudah download tool kompresi yang masbuat..yang saya motanyakan gimana cara membuka file hasil kompresi tersebut dan bagaimana cara kerja tool kompresi yang masbuat tersebut…mohon pencerahannya…trims…

  11. Mas, kalo untuk buat SFX (e.g WinRAR) gimana caranya..? Soalnya saya kesulitan cari algoritma(e.g LZMA, BZIP) untuk kompresinya, juga cara mengimplementasikan EOFnya. Thanks🙂

  12. Stub (File Exe yang menjadi kepala SFX) harus dibuat sebaik mungkin. Posisi stub dan data kira-kira:
    [STUB][COMPRESSED_DATA][SFXFOOTER]
    Nah, membuat SFX kan terbagi dua bagian:
    1. Kompilasi SFX
    Langkah ini mengkopi SFX Stub ke folder yang ditentukan, mencatat panjang file STUB, kemudian menempelkan data yang telah terkompres ke akhir file, mencatat panjang data yang terkompress. kemudian panjang kedua data ditulis ke akhir file.

    2. Saat eksekusi SFX
    SFX Stub akan membaca dirinya sendiri mulai dari EOF sebanyak 2 * 4 byte (Data bertipe dword, terdiri dari 4 byte), yang satu panjang stub dan yang kedua panjang data terkompres.
    Panjang stub adalah posisi EOF dari SFX Stub dan BOF dari Data terkompress. Tinggal membaca data pada posisi (PANJANG STUB + 1) sebanyak (PANJANG DATA TERKOMPRESS), kita sudah dapat mengekstrak data ke file, dan menjalankan prosedur dekompresi sesuai library kompresi yang dipakai…

    Saya sudah lama pengen menulis posting SFX ini, cuma posting yang panjang dan waktu terbatas, saya jadi menunda terus..

    • Maaf mas Rahman, saya gak ada mirror unduhnya. Besok Insya Allah ta’ cek di PC di kantor. Kali aja masih ada SRC-nya.

      WP sekarang kejam, main hapus aja…

    • Maaf Mas. Saat ini belum bisa memberi alternatif link. Kami akan mencari dalam harddisk dulu, kalo ketemu nanti diinfokan. Maaf ya mas…

  13. Alhmdulillah maksih banyak mas……berguna banget buat kami…..teruslah berkarya, dan smoga ALLAH senantiasa memberikan kesehatan tuk mas…mksih banyak mas. 2 jempol the hehhe ^_^ …di nantikan postingan”gn brikutnya

  14. Membukanya lewat tool ini juga, lewat tab menu Decompression. Klik kanan pada daftar, Add semua file-file yang sebelumnya dikompress dengan tool ini, trus klik Decompress.

    Btw, tool ini hanya contoh konsep aplikasi kompresi. Teman2 yang lain menggunakannya sebagai bahan acuan tugas akhir. Belum dapat dipakai seperti Winzip, Winrar, dsb…
    🙂

  15. Oh iya Mas,,,,
    itu juga sebenarnya tugas Akhir saya juga,,,,

    Metode apa yang dipakai dalam Mengkompress menggunakan Algoritma Zlib???, karna kebetulan Dosen saya menanyakan Metodenya yang dipakai Di Algoritma Zlib……..

  16. muis :

    Oh iya Mas,,,,
    itu juga sebenarnya tugas Akhir saya juga,,,,

    Metode apa yang dipakai dalam Mengkompress menggunakan Algoritma Zlib???, karna kebetulan Dosen saya menanyakan Metodenya yang dipakai Di Algoritma Zlib……..

    Metode Lemvel – Zip pastinya….

  17. mengubah besar gambar atau mengubah ukuran pixel…..

    krna ini berhubungan tentang Steganografi dengan memperbesar ukuran gambar…

    kira-kira metode apa yang dipakai?????

  18. tab menu Decompression. Klik kanan pada daftar, Add semua file-file yang sebelumnya dikompress dengan tool ini, trus klik Decompress.

    Mas bagaimana kalo saya mau pisah antara Decompres dan compres dengan form yang berbeda….
    tapi tampilannya sama…begitu bagaimana caranya??

  19. mas, saya dapat tugas suruh bikin aplikasi kompresi dengan metode huffman, itu bagaimana y sourcodenya..
    makasih bgt sebelumnya.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s