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. |