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.
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. |
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: |
Windows, Nachrichten, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge, StdCtrls, Zlib; |
procedure Button1Click(Sender: TObject); |
procedure Button2Click(Sender: TObject); |
{Öffentliche Erklärungen} |
1. Erfassen Sie ein Vollbild |
procedure GetScreen(var Bmp: TBitmap); |
MyCanvas := TCanvas.Create; |
MyRect:=Rect(0, 0,Screen.Width, Screen.Height); |
//Das Bild hat eine 24-Bit-Echtfarbendarstellung, die auch an die tatsächlichen Bedürfnisse angepasst werden kann. |
Bmp.PixelFormat := pf24bit; |
Bmp.Width := MyRect.Right; |
Bmp.Height := MyRect.Bottom; |
//Erfassen Sie das gesamte Bildschirmbild |
Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect); |
procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel); |
SourceStream: TCompressionStream; |
DestStream: TMemoryStream; |
//Originalgröße des Bildstreams abrufen |
Count := CompressedStream.Size; |
DestStream := TMemoryStream.Create; |
SourceStream:=TCompressionStream.Create |
(CompressionLevel, DestStream); |
//SourceStream speichert den Originalbildstream |
CompressedStream.SaveToStream(SourceStream); |
//Komprimieren Sie den ursprünglichen Bildstream und der komprimierte Bildstream wird in DestStream gespeichert. |
//Schreiben Sie die Größe des Originalbildes |
CompressedStream.WriteBuffer(Count, SizeOf |
//Den komprimierten Bildstream schreiben |
CompressedStream.CopyFrom(DestStream, 0); |
3. Komprimierte Bilder wiederherstellen |
procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); |
SourceStream: TDecompressionStream; |
DestStream: TMemoryStream; |
//Lesen Sie die Größe des Originalbilds aus dem komprimierten Bildstream |
CompressedStream.ReadBuffer(Count, SizeOf(Count)); |
//Speicherblöcke für den zu lesenden Originalbildstream basierend auf der Bildgröße zuweisen |
DestStream := TMemoryStream.Create; |
SourceStream := TDecompressionStream.Create(CompressedStream); |
//Dekomprimieren Sie den komprimierten Bildstream und speichern Sie ihn im Pufferspeicherblock |
SourceStream.ReadBuffer(Buffer^, Count); |
//Speichern Sie den Originalbildstream im DestStream-Stream |
DestStream.WriteBuffer(Buffer^, Count); |
DestStream.Position := 0;//Stream-Zeiger zurücksetzen |
//Laden Sie den Originalbildstream aus dem DestStream-Stream |
Bmp.LoadFromStream(DestStream); |
4. OnClick-Ereignis der Komprimierungsschaltfläche |
procedure TForm1.Button1Click(Sender: TObject); |
CompressedStream: TMemoryStream; |
CompressedStream := TMemoryStream.Create; |
//Erfassen Sie den gesamten aktuellen Bildschirm und speichern Sie das Bild im Bmp-Objekt GetScreen(Bmp); |
//Speichern Sie das Bild im Bmp-Objekt im Speicherstream |
Bmp.SaveToStream(CompressedStream); |
//Komprimieren Sie den Originalbildstream gemäß dem Standardkomprimierungsverhältnis |
CompressBitmap(CompressedStream, clDefault); |
//Speichern Sie den komprimierten Bildstream in einer benutzerdefinierten Formatdatei |
CompressedStream.SaveToFile(' C:cj.dat' ); |
5. Schaltfläche OnClick-Ereignis entpacken |
procedure TForm1.Button2Click(Sender: TObject); |
CompressedStream: TFileStream; |
//Öffnen Sie eine benutzerdefinierte komprimierte Formatdatei im schreibgeschützten Modus des Dateistreams |
CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
//Dekomprimieren Sie den komprimierten Bildstream |
UnCompressBitmap(CompressedStream, Bmp); |
//Stellen Sie den ursprünglichen Bildstream in der angegebenen BMP-Datei wieder her |
Bmp.SaveToFile(' C:cj.bmp' ); |
Darüber hinaus stellt das TCompressionStream-Objekt auch die Eigenschaft „CompressionRate“ bereit, mit der das Komprimierungsverhältnis nach der Komprimierung der Originaldaten beschrieben wird. Entwickler können in dieses Ereignis schreiben, um den Fortschritt anzuzeigen . |
Der obige Code besteht aus Debugging und Ausführung in Delphi 5.0. |