Pemrosesan kompresi data Delphi(1)
Alat pengembangan RAD Delphi 5.0 yang diluncurkan oleh Borland Company adalah alat pengembangan utama pada platform Windows. Lingkungan pengembangan visual dan fungsi pemrograman berorientasi objek yang kuat telah menarik banyak pengembang. Namun, beberapa programmer sering kesulitan mengompresi data dalam jumlah besar selama proses pengembangan sebenarnya, dan harus menemukan beberapa algoritma kompresi yang efisien atau mencari kontrol pihak ketiga di Internet untuk mencapai kompresi. Bukankah Delphi sendiri menyediakan fungsi ini? Faktanya, programmer Delphi telah mempertimbangkan hal ini. Mereka menyediakan dua file unit, Zlib.pas dan Zlibconst.pas, untuk memecahkan masalah kompresi data dan mencapai rasio kompresi data yang tinggi. Kedua file ini disimpan di direktori lib InfoExtras pada CD instalasi Delphi 5.0. Selain itu, file Obj yang direferensikan oleh unit Zlib.pas juga disimpan di direktori libObj InfoExtras. Artikel berikut menggunakan kompresi salinan layar sebagai contoh untuk memperkenalkan cara menggunakan fungsi ini.
Ide solusi
Pertama, gunakan salinan layar untuk mengambil gambar keseluruhan layar saat ini, lalu simpan dalam memori sebagai format file BMP. Saat mengompresi, gunakan objek TComPRessionStream untuk mengompresi gambar asli dan menyimpannya dalam format file khusus; saat mendekompresi, gunakan objek TDecompressionStream untuk mendekompresi gambar terkompresi dan mengembalikannya ke file gambar berformat BMP.
Implementasi khusus
Buat file proyek baru, referensi Zlib.pas di bagian antarmuka unit utama, tempatkan dua tombol Button1 dan Button2 pada formulir utama, dan tulis kode panggilan prosedur yang sesuai di acara OnClick mereka.
Bagian dari kode sumber program adalah sebagai berikut:
satuan Unit1;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog, StdCtrls, Zlib;
jenis
TForm1 = kelas(TForm)
Tombol1: Tombol T;
Tombol2: Tombol T;
prosedur Button1Click(Pengirim: TObject);
prosedur Button2Click(Pengirim: TObject);
pribadi
{Deklarasi pribadi}
publik
{Pernyataan publik}
akhir;
var
Formulir1: TForm1;
pelaksanaan
{$ R* .DFM}
1. Tangkap gambar layar penuh
prosedur GetScreen(var Bmp: TBitmap);
var
DC: HDC;
Kanvas Saya: TCanvas;
MyRect: Benar;
mulai
Dc := GetWindowDC(0);
MyCanvas := TCanvas.Buat;
mencoba
Kanvas Saya.Handle := Dc;
MyRect:=Rect(0, 0,Layar.Lebar, Layar.Tinggi);
file://Gambar adalah warna asli 24-bit dan juga dapat disesuaikan dengan kebutuhan sebenarnya.
Bmp.PixelFormat := pf24bit;
Bmp.Lebar := MyRect.Right;
Bmp.Tinggi := MyRect.Bottom;
file://menangkap gambar seluruh layar
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
Akhirnya
Kanvas Saya.Handle := 0;
Kanvas Saya.Gratis;
RilisDC(0, Dc);
akhir;
akhir;
2. Kompres gambar
prosedur CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
SourceStream: TCompressionStream;
Aliran Tujuan: TMemoryStream;
Hitungan: Integer;
Mulai
file://mendapatkan ukuran asli aliran gambar
Hitung := CompressedStream.Size;
DestStream := TMemoryStream.Buat;
SourceStream:=TCompressionStream.Buat
(Tingkat Kompresi, DestStream);
Mencoba
Aliran gambar asli disimpan di file://SourceStream
CompressedStream.SaveToStream(SourceStream);
file://mengompresi aliran gambar asli, dan aliran gambar terkompresi disimpan di DestStream
SourceStream.Gratis;
CompressedStream.Clear;
file://tulis dimensi gambar asli
CompressedStream.WriteBuffer(Hitungan, SizeOf
(Menghitung));
file://Tulis aliran gambar terkompresi
CompressedStream.CopyFrom(DestStream, 0);
Akhirnya
DestStream.Gratis;
akhir;
akhir;
3. Pulihkan gambar terkompresi
prosedur UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
SourceStream: TDecompressionStream;
Aliran Tujuan: TMemoryStream;