Delphi-Datenkomprimierungsverarbeitung(1)
Das von Borland Company eingeführte RAD-Entwicklungstool Delphi 5.0 ist ein Mainstream-Entwicklungstool auf der Windows-Plattform. Seine visuelle Entwicklungsumgebung und leistungsstarke objektorientierte Programmierfunktionen haben unzählige Entwickler angezogen. Einige Programmierer haben jedoch häufig Probleme mit der Komprimierung großer Datenmengen während des eigentlichen Entwicklungsprozesses und müssen einige effiziente Komprimierungsalgorithmen finden oder im Internet nach Steuerelementen von Drittanbietern suchen, um eine Komprimierung zu erreichen. Bietet Delphi selbst diese Funktion nicht? Tatsächlich haben Delphi-Programmierer dies bereits in Betracht gezogen. Sie haben zwei Unit-Dateien bereitgestellt, Zlib.pas und Zlibconst.pas, um das Datenkomprimierungsproblem zu lösen und eine hohe Datenkomprimierungsrate zu erreichen. Diese beiden Dateien werden im InfoExtras-lib-Verzeichnis auf der Delphi 5.0-Installations-CD gespeichert. Darüber hinaus wird die Obj-Datei, auf die die Zlib.pas-Einheit verweist, auch im InfoExtras-libObj-Verzeichnis gespeichert. Der folgende Artikel dient als Beispiel für die Komprimierung einer Bildschirmkopie, um die Verwendung dieser Funktion vorzustellen.
Lösungsideen
Verwenden Sie zunächst die Bildschirmkopie, um das aktuelle Bild des gesamten Bildschirms zu erfassen und es dann im BMP-Dateiformat im Speicher zu speichern. Beim Komprimieren verwenden Sie das TComPRessionStream-Objekt, um das Originalbild zu komprimieren und in einem benutzerdefinierten Dateiformat zu speichern. Beim Dekomprimieren verwenden Sie das TDecompressionStream-Objekt, um das komprimierte Bild zu dekomprimieren und es in einer Bilddatei im BMP-Format wiederherzustellen.
Konkrete Umsetzung
Erstellen Sie eine neue Projektdatei, referenzieren Sie Zlib.pas im Schnittstellenteil der Haupteinheit, platzieren Sie zwei Schaltflächen Button1 und Button2 im Hauptformular und schreiben Sie den entsprechenden Prozeduraufrufcode in ihr OnClick-Ereignis.
Ein Teil des Programmquellcodes lautet wie folgt:
Einheit Einheit1;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge, StdCtrls, Zlib;
Typ
TForm1 = Klasse(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
Privat
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
Ende;
var
Form1: TForm1;
Durchführung
{$ R* .DFM}
1. Erfassen Sie ein Vollbild
procedure GetScreen(var Bmp: TBitmap);
var
Gleichstrom: HDC;
MyCanvas: TCanvas;
MyRect: TRect;
beginnen
Dc := GetWindowDC(0);
MyCanvas := TCanvas.Create;
versuchen
MyCanvas.Handle := Dc;
MyRect:=Rect(0, 0,Screen.Width, Screen.Height);
file://Das Bild ist 24-Bit-Echtfarben und kann auch an die tatsächlichen Bedürfnisse angepasst werden.
Bmp.PixelFormat := pf24bit;
Bmp.Width := MyRect.Right;
Bmp.Height := MyRect.Bottom;
file://Erfassen Sie das gesamte Bildschirmbild
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
Endlich
MyCanvas.Handle := 0;
MyCanvas.Free;
ReleaseDC(0, Dc);
Ende;
Ende;
2. Bilder komprimieren
procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Anzahl: Ganzzahl;
Beginnen
file://ruft die Originalgröße des Bildstreams ab
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(CompressionLevel, DestStream);
Versuchen
Der ursprüngliche Bildstream wird in file://SourceStream gespeichert
CompressedStream.SaveToStream(SourceStream);
file://komprimiert den ursprünglichen Bildstream und der komprimierte Bildstream wird in DestStream gespeichert
SourceStream.Free;
CompressedStream.Clear;
file://schreibe die Abmessungen des Originalbildes
CompressedStream.WriteBuffer(Count, SizeOf
(Zählen));
file://Schreiben Sie einen komprimierten Bildstream
CompressedStream.CopyFrom(DestStream, 0);
Endlich
DestStream.Free;
Ende;
Ende;
3. Komprimierte Bilder wiederherstellen
procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;