La herramienta de desarrollo RAD Delphi 5.0 lanzada por Borland Company es una herramienta de desarrollo convencional en la plataforma Windows. Su entorno de desarrollo visual y sus potentes funciones de programación orientada a objetos han atraído a innumerables desarrolladores. Sin embargo, algunos programadores a menudo tienen dificultades para comprimir grandes cantidades de datos durante el proceso de desarrollo real y tienen que encontrar algunos algoritmos de compresión eficientes o buscar controles de terceros en Internet para lograr la compresión. ¿No proporciona Delphi esta función? De hecho, los programadores de Delphi ya lo han considerado. Proporcionaron dos archivos unitarios, Zlib.pas y Zlibconst.pas, para resolver el problema de compresión de datos y lograr una alta tasa de compresión de datos. Estos dos archivos se guardan en el directorio lib de InfoExtras en el CD de instalación de Delphi 5.0. Además, el archivo Obj al que hace referencia la unidad Zlib.pas también se guarda en el directorio libObj de InfoExtras. El siguiente artículo toma como ejemplo la compresión de una copia de pantalla para presentar cómo utilizar esta función.
Primero, use la copia de pantalla para capturar la imagen actual de toda la pantalla y luego guárdela en la memoria como un formato de archivo BMP. Al comprimir, use el objeto TComPRessionStream para comprimir la imagen original y guardarla en un formato de archivo personalizado; al descomprimir, use el objeto TDecompressionStream para descomprimir la imagen comprimida y restaurarla a un archivo de imagen en formato BMP. |
Implementación específica |
Cree un nuevo archivo de proyecto, haga referencia a Zlib.pas en la parte de la interfaz de la unidad principal, coloque dos botones Botón1 y Botón2 en el formulario principal y escriba el código de llamada al procedimiento correspondiente en su evento OnClick. |
Parte del código fuente del programa es el siguiente: |
Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Diálogos, StdCtrls, Zlib; |
procedimiento Button1Click(Remitente: TObject); |
procedimiento Button2Click(Remitente: TObject); |
1. Capturar imagen en pantalla completa |
procedimiento GetScreen(var Bmp: TBitmap); |
MiCanvas := TCanvas.Create; |
MyRect:=Rect(0, 0,Pantalla.Ancho, Pantalla.Alto); |
//La imagen tiene un color verdadero de 24 bits, que también se puede ajustar según las necesidades reales. |
Bmp.PixelFormat := pf24bit; |
Bmp.Ancho := MyRect.Right; |
Bmp.Height := MyRect.Bottom; |
//Captura la imagen completa de la pantalla |
Bmp.Canvas.CopyRect(MiRect, MiCanvas, MiRect); |
procedimiento CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel); |
FuenteStream: TCompressionStream; |
DestStream: TMemoryStream; |
//Obtener el tamaño original de la secuencia de imágenes |
Contar := CompressedStream.Size; |
DestStream := TMemoryStream.Create; |
FuenteStream:=TCompressionStream.Create |
(Nivel de compresión, DestStream); |
//SourceStream almacena el flujo de imágenes original |
CompressedStream.SaveToStream(SourceStream); |
// Comprime el flujo de imágenes original y el flujo de imágenes comprimidas se almacena en DestStream. |
Corriente comprimida.Claro; |
//Escribe el tamaño de la imagen original |
CompressedStream.WriteBuffer (Recuento, Tamaño de |
//Escribe el flujo de imágenes comprimidas |
CompressedStream.CopyFrom(DestStream, 0); |
3. Restaurar imágenes comprimidas |
procedimiento UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); |
FuenteStream: TDecompressionStream; |
DestStream: TMemoryStream; |
//Leer el tamaño de la imagen original del flujo de imágenes comprimidas |
CompressedStream.ReadBuffer(Conteo, TamañoDe(Conteo)); |
//Asigne bloques de memoria para que la secuencia de imágenes original se lea de acuerdo con el tamaño de la imagen |
DestStream := TMemoryStream.Create; |
SourceStream := TDecompressionStream.Create(CompressedStream); |
//Descomprime el flujo de imágenes comprimidas y lo almacena en el bloque de memoria intermedia |
SourceStream.ReadBuffer(Buffer^, Conde); |
//Guarda la secuencia de imágenes original en la secuencia DestStream |
DestStream.WriteBuffer(Buffer^, Conde); |
DestStream.Position := 0;//Restablecer puntero de flujo |
//Carga la secuencia de imágenes original desde la secuencia DestStream |
Bmp.LoadFromStream(DestStream); |
4. Evento OnClick del botón de compresión |
procedimiento TForm1.Button1Click (Remitente: TObject); |
Corriente comprimida: TMemoryStream; |
CompressedStream := TMemoryStream.Create; |
//Capture toda la pantalla actual y guarde la imagen en el objeto Bmp GetScreen(Bmp); |
//Guarda la imagen en el objeto Bmp en el flujo de memoria |
Bmp.SaveToStream(CompressedStream); |
//Comprime la secuencia de imágenes original según la relación de compresión predeterminada |
CompressBitmap(CompressedStream, clDefault); |
//Guarda el flujo de imágenes comprimidas en un archivo de formato personalizado |
CompressedStream.SaveToFile('C:cj.dat'); |
5. Evento OnClick del botón descomprimir |
procedimiento TForm1.Button2Click (Remitente: TObject); |
Corriente comprimida: TFileStream; |
//Abre un archivo de formato comprimido personalizado en modo de solo lectura de la secuencia de archivos |
CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
//Descomprime el flujo de imágenes comprimidas |
UnCompressBitmap(CompressedStream, Bmp); |
//Restaurar la secuencia de imágenes original en el archivo BMP especificado |
Bmp.SaveToFile('C:cj.bmp'); |
Además, el objeto TCompressionStream también proporciona la propiedad CompressionRate, que se utiliza para describir la relación de compresión después de comprimir los datos originales. El evento OnProgress se activa durante los procesos de compresión y descompresión. Los desarrolladores pueden escribir en este evento para mostrar el código. . |
El código anterior pasa la depuración y la ejecución en Delphi 5.0. |