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.
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. |
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: |
Windows, Mensagens, SysUtils, Classes, Gráficos, Controles, Formulários, Diálogos, StdCtrls, Zlib; |
procedimento Button1Click(Remetente: TObject); |
procedimento Button2Click(Remetente: TObject); |
1. Capturar imagem em tela cheia |
procedimento GetScreen(var Bmp: TBitmap); |
MinhaCanvas := TCanvas.Create; |
MinhaCanvas.Handle := Dc; |
MeuRect:=Rect(0, 0,Tela.Largura, Tela.Altura); |
//A imagem é true color de 24 bits, que também pode ser ajustada de acordo com as necessidades reais. |
Bmp.PixelFormat := pf24bit; |
Bmp.Largura := MeuRect.Right; |
Bmp.Height := MeuRect.Bottom; |
//Captura a imagem inteira da tela |
Bmp.Canvas.CopyRect(MeuRect, MinhaCanvas, MeuRect); |
procedimento CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel); |
SourceStream: TCompressionStream; |
DestStream: TMemoryStream; |
//Obtém o tamanho original do stream de imagem |
Contagem := CompressedStream.Size; |
DestStream := TMemoryStream.Create; |
SourceStream:=TCompressionStream.Create |
(CompressionLevel, DestStream); |
//SourceStream armazena o fluxo de imagem original |
CompressedStream.SaveToStream(SourceStream); |
//Compacta o fluxo de imagem original e o fluxo de imagem compactado é armazenado em DestStream. |
//Escreve o tamanho da imagem original |
CompressedStream.WriteBuffer (Contagem, SizeOf |
//Escreve o stream da imagem compactada |
CompressedStream.CopyFrom(DestStream, 0); |
3. Restaurar imagens compactadas |
procedimento UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); |
SourceStream: TDecompressionStream; |
DestStream: TMemoryStream; |
//Lê o tamanho da imagem original do fluxo de imagens compactadas |
CompressedStream.ReadBuffer(Contagem, SizeOf(Contagem)); |
//Aloca blocos de memória para o fluxo de imagem original ser lido de acordo com o tamanho da imagem |
GetMem(Buffer, Contagem); |
DestStream := TMemoryStream.Create; |
SourceStream := TDecompressionStream.Create(CompressedStream); |
//Descompacta o fluxo de imagem compactado e armazena-o no bloco de memória Buffer |
SourceStream.ReadBuffer(Buffer^, Contagem); |
//Salva o stream da imagem original no stream DestStream |
DestStream.WriteBuffer(Buffer^, Contagem); |
DestStream.Position := 0;//Redefinir ponteiro de fluxo |
//Carrega o stream de imagem original do stream DestStream |
Bmp.LoadFromStream(DestStream); |
4. Evento OnClick do botão de compactação |
procedimento TForm1.Button1Click(Remetente: TObject); |
ComprimidoStream: TMemoryStream; |
ComprimidoStream := TMemoryStream.Create; |
//Captura toda a tela atual e salva a imagem no objeto Bmp GetScreen(Bmp); |
//Salva a imagem no objeto Bmp no fluxo de memória |
Bmp.SaveToStream(ComprimidoStream); |
//Comprime o fluxo de imagem original de acordo com a taxa de compactação padrão |
CompressBitmap(CompressedStream, clDefault); |
//Salve o fluxo de imagem compactado em um arquivo de formato personalizado |
CompressedStream.SaveToFile('C:cj.dat' ); |
5. Evento OnClick do botão Descompactar |
procedimento TForm1.Button2Click(Remetente: TObject); |
ComprimidoStream: TFileStream; |
//Abre um arquivo de formato compactado personalizado no modo somente leitura do fluxo de arquivos |
CompressedStream := TFileStream.Create(' C:cj.dat' , fmOpenRead); |
//Descompacta o fluxo de imagem compactado |
UnCompressBitmap(ComprimidoStream, Bmp); |
//Restaura o fluxo de imagem original para o arquivo BMP especificado |
Bmp.SaveToFile('C:cj.bmp' ); |
Além disso, o objeto TCompressionStream também fornece a propriedade CompressionRate, que é usada para descrever a taxa de compactação após a compactação dos dados originais. O evento OnProgress é acionado durante os processos de compactação e descompactação. . |
O código acima passa na depuração e execução no Delphi 5.0. |