L'outil de développement RAD Delphi 5.0 lancé par Borland Company est un outil de développement grand public sur la plate-forme Windows. Son environnement de développement visuel et ses puissantes fonctions de programmation orientée objet ont attiré d'innombrables développeurs. Cependant, certains programmeurs ont souvent du mal à compresser de grandes quantités de données au cours du processus de développement lui-même et doivent trouver des algorithmes de compression efficaces ou rechercher des contrôles tiers sur Internet pour obtenir la compression. Delphi lui-même ne fournit-il pas cette fonction ? En fait, les programmeurs Delphi y ont déjà pensé : ils ont fourni deux fichiers unitaires, Zlib.pas et Zlibconst.pas, pour résoudre le problème de compression des données et obtenir un taux de compression de données élevé. Ces deux fichiers sont enregistrés dans le répertoire InfoExtras lib sur le CD d'installation de Delphi 5.0. De plus, le fichier Obj référencé par l'unité Zlib.pas est également enregistré dans le répertoire InfoExtras libObj. L'article suivant prend la compression d'une copie d'écran comme exemple pour présenter comment utiliser cette fonction.
Tout d’abord, utilisez la copie d’écran pour capturer l’image actuelle de tout l’écran, puis enregistrez-la dans la mémoire au format de fichier BMP. Lors de la compression, utilisez l'objet TComPRessionStream pour compresser l'image originale et enregistrez-la dans un format de fichier personnalisé ; lors de la décompression, utilisez l'objet TDecompressionStream pour décompresser l'image compressée et la restaurer dans un fichier image au format BMP. |
Créez un nouveau fichier projet, référencez Zlib.pas dans la partie interface de l'unité principale, placez deux boutons Button1 et Button2 sur le formulaire principal, et écrivez le code d'appel de procédure correspondant dans leur événement OnClick. |
Une partie du code source du programme est la suivante : |
Windows, messages, SysUtils, classes, graphiques, contrôles, formulaires, boîtes de dialogue, StdCtrls, Zlib ; |
procédure Button1Click (Expéditeur : TObject); |
procédure Button2Click (Expéditeur : TObject); |
1. Capturer une image en plein écran |
procédure GetScreen(var Bmp: TBitmap); |
MonCanvas := TCanvas.Create; |
MonRect:=Rect(0, 0,Screen.Width, Screen.Height); |
//L'image est en vraies couleurs 24 bits, qui peuvent également être ajustées en fonction des besoins réels. |
Bmp.PixelFormat := pf24bit; |
Bmp.Width := MonRect.Right; |
Bmp.Height := MonRect.Bottom; |
// Capturer l'intégralité de l'image de l'écran |
Bmp.Canvas.CopyRect(MonRect, MonCanvas, MonRect); |
procédure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel); |
SourceStream : TCompressionStream ; |
DestStream : TMemoryStream ; |
//Obtenir la taille originale du flux d'images |
Nombre := CompressedStream.Size ; |
DestStream := TMemoryStream.Create; |
SourceStream :=TCompressionStream.Create |
(Niveau de compression, DestStream) ; |
//SourceStream stocke le flux d'images d'origine |
CompressedStream.SaveToStream(SourceStream); |
// Compressez le flux d'images d'origine et le flux d'images compressé est stocké dans DestStream. |
//Écrit la taille de l'image originale |
CompressedStream.WriteBuffer(Compte, TailleDe |
//Écrit le flux d'images compressé |
CompressedStream.CopyFrom(DestStream, 0); |
3. Restaurer les images compressées |
procédure UnCompressBitmap(const CompressedStream : TFileStream ; var Bmp : TBitmap) ; |
SourceStream : TDecompressionStream ; |
DestStream : TMemoryStream ; |
//Lire la taille de l'image originale à partir du flux d'images compressé |
CompressedStream.ReadBuffer(Count, SizeOf(Count)); |
//Alloue des blocs de mémoire pour que le flux d'images d'origine soit lu en fonction de la taille de l'image |
DestStream := TMemoryStream.Create; |
SourceStream := TDecompressionStream.Create(CompressedStream); |
// Décompressez le flux d'images compressé et stockez-le dans le bloc mémoire Buffer |
SourceStream.ReadBuffer(Buffer^, Count); |
//Enregistrez le flux d'images d'origine dans le flux DestStream |
DestStream.WriteBuffer(Buffer^, Nombre); |
DestStream.Position := 0;//Réinitialiser le pointeur de flux |
//Charge le flux d'images d'origine à partir du flux DestStream |
Bmp.LoadFromStream(DestStream); |
4. Événement OnClick du bouton de compression |
procédure TForm1.Button1Click(Expéditeur : TObject); |
CompressedStream : TMemoryStream ; |
CompressedStream := TMemoryStream.Create; |
// Capturez l'intégralité de l'écran actuel et enregistrez l'image dans l'objet Bmp GetScreen(Bmp); |
//Enregistrez l'image dans l'objet Bmp dans le flux mémoire |
Bmp.SaveToStream(CompressedStream); |
//Compressez le flux d'images d'origine selon le taux de compression par défaut |
CompressBitmap(CompressedStream, clDefault); |
//Enregistrez le flux d'images compressé dans un fichier au format personnalisé |
CompressedStream.SaveToFile(' C:cj.dat' ); |
5. Événement OnClick du bouton Décompresser |
procédure TForm1.Button2Click(Expéditeur : TObject); |
CompriméStream : TFileStream ; |
//Ouvre un fichier au format compressé personnalisé en mode lecture seule du flux de fichiers |
CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
// Décompresser le flux d'images compressé |
UnCompressBitmap (CompressedStream, Bmp); |
//Restaurer le flux d'images d'origine dans le fichier BMP spécifié |
Bmp.SaveToFile(' C:cj.bmp' ); |
De plus, l'objet TCompressionStream fournit également la propriété CompressionRate, qui est utilisée pour décrire le taux de compression après la compression des données d'origine. L'événement OnProgress est déclenché pendant les processus de compression et de décompression. Les développeurs peuvent écrire dans cet événement pour afficher la progression. . |
Le code ci-dessus passe le débogage et s'exécute dans Delphi 5.0. |