Procesamiento de compresión de datos de Delphi(1)
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.
Ideas de solució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:
unidad Unidad1;
interfaz
usos
Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Diálogos, StdCtrls, Zlib;
tipo
TForm1 = clase(TForm)
Botón1: TBotón;
Botón2: TBotón;
procedimiento Button1Click(Remitente: TObject);
procedimiento Button2Click(Remitente: TObject);
privado
{Declaraciones privadas}
público
{Declaraciones públicas}
fin;
var
Formulario1: TForm1;
implementación
{$R* .DFM}
1. Capturar imagen en pantalla completa
procedimiento GetScreen(var Bmp: TBitmap);
var
CC: HDC;
MiCanvas: TCanvas;
MiRect: TRect;
comenzar
CC := GetWindowDC(0);
MiCanvas := TCanvas.Create;
intentar
MiCanvas.Handle := Dc;
MyRect:=Rect(0, 0,Pantalla.Ancho, Pantalla.Alto);
file://La imagen tiene un color verdadero de 24 bits y también se puede ajustar según las necesidades reales.
Bmp.PixelFormat := pf24bit;
Bmp.Ancho := MyRect.Right;
Bmp.Height := MyRect.Bottom;
file://capturar imagen en pantalla completa
Bmp.Canvas.CopyRect(MiRect, MiCanvas, MiRect);
finalmente
MiCanvas.Handle := 0;
MiCanvas.Gratis;
LiberarDC(0, Dc);
fin;
fin;
2. Comprimir imágenes
procedimiento CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
FuenteStream: TCompressionStream;
DestStream: TMemoryStream;
Conteo: Entero;
Comenzar
file://obtiene el tamaño original de la secuencia de imágenes
Contar := CompressedStream.Size;
DestStream := TMemoryStream.Create;
FuenteStream:=TCompressionStream.Create
(Nivel de compresión, DestStream);
Intentar
La secuencia de imágenes original se almacena en el archivo: //SourceStream
CompressedStream.SaveToStream(SourceStream);
file:// comprime el flujo de imágenes original y el flujo de imágenes comprimidas se almacena en DestStream
SourceStream.Gratis;
Corriente comprimida.Claro;
file://escribe las dimensiones de la imagen original
CompressedStream.WriteBuffer (Recuento, Tamaño de
(Contar));
file://Escribir una secuencia de imágenes comprimidas
CompressedStream.CopyFrom(DestStream, 0);
finalmente
DestStream.Gratis;
fin;
fin;
3. Restaurar imágenes comprimidas
procedimiento UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
FuenteStream: TDecompressionStream;
DestStream: TMemoryStream;