Processamento de compactação de dados Delphi(1)
A ferramenta de desenvolvimento RAD Delphi 5.0 lançada pela Borland Company é uma ferramenta de desenvolvimento convencional na plataforma Windows. Seu ambiente de desenvolvimento visual e poderosas funções de programação orientada a objetos atraíram inúmeros desenvolvedores. No entanto, alguns programadores muitas vezes lutam para compactar grandes quantidades de dados durante o processo de desenvolvimento real e precisam encontrar alguns algoritmos de compactação eficientes ou procurar controles de terceiros na Internet para obter a compactação. O próprio Delphi não fornece essa função? Na verdade, os programadores Delphi já consideraram isso. Eles forneceram dois arquivos unitários, Zlib.pas e Zlibconst.pas, para resolver o problema de compactação de dados e obter uma alta taxa de compactação de dados. Esses dois arquivos são salvos no diretório InfoExtras lib no CD de instalação do Delphi 5.0. Além disso, o arquivo Obj referenciado pela unidade Zlib.pas também é salvo no diretório InfoExtras libObj. O artigo a seguir toma a compactação de uma cópia da tela como exemplo para apresentar como usar esta função.
Ideias de soluções
Primeiro, use a cópia da tela para capturar a imagem atual da tela inteira e, em seguida, salve-a na memória como um formato de arquivo BMP. Ao compactar, use o objeto TComPRessionStream para compactar a imagem original e salvá-la em um formato de arquivo personalizado; ao descompactar, use o objeto TDecompressionStream para descompactar a imagem compactada e restaurá-la em um arquivo de imagem no formato BMP.
Implementação específica
Crie um novo arquivo de projeto, faça referência a Zlib.pas na parte de interface da unidade principal, coloque dois botões Button1 e Button2 no formulário principal e escreva o código de chamada de procedimento correspondente em seu evento OnClick.
Parte do código-fonte do programa é a seguinte:
unidade Unidade1;
interface
usa
Windows, Mensagens, SysUtils, Classes, Gráficos, Controles, Formulários, Diálogos, StdCtrls, Zlib;
tipo
TForm1 = classe(TForm)
Botão1: Botão T;
Botão2: Botão T;
procedimento Button1Click(Remetente: TObject);
procedimento Button2Click(Remetente: TObject);
privado
{Declarações privadas}
público
{Declarações públicas}
fim;
var
Formulário1: TForm1;
implementação
{$R*.DFM}
1. Capturar imagem em tela cheia
procedimento GetScreen(var Bmp: TBitmap);
var
Dc: HDC;
MinhaCanvas: TCanvas;
MeuRect: TRect;
começar
Dc := GetWindowDC(0);
MinhaCanvas := TCanvas.Create;
tentar
MinhaCanvas.Handle := Dc;
MeuRect:=Rect(0, 0,Tela.Largura, Tela.Altura);
file://A imagem é true color de 24 bits e também pode ser ajustada de acordo com as necessidades reais
Bmp.PixelFormat := pf24bit;
Bmp.Largura := MeuRect.Right;
Bmp.Height := MeuRect.Bottom;
arquivo: // captura a imagem da tela inteira
Bmp.Canvas.CopyRect(MeuRect, MinhaCanvas, MeuRect);
finalmente
MinhaCanvas.Handle := 0;
MinhaCanvas.Free;
LiberarDC(0, CC);
fim;
fim;
2. Compactar imagens
procedimento CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel);
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Contagem: Inteiro;
Começar
file://obtém o tamanho original do fluxo de imagem
Contagem := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(CompressionLevel, DestStream);
Tentar
O fluxo de imagem original é armazenado em file://SourceStream
CompressedStream.SaveToStream(SourceStream);
file://comprime o fluxo de imagem original e o fluxo de imagem compactado é armazenado em DestStream
FonteStream.Free;
ComprimidoStream.Clear;
file://grava as dimensões da imagem original
CompressedStream.WriteBuffer (Contagem, SizeOf
(Contar));
file://Escrever um fluxo de imagem compactado
CompressedStream.CopyFrom(DestStream, 0);
finalmente
DestStream.Free;
fim;
fim;
3. Restaurar imagens compactadas
procedimento UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;