Delphi提供的压缩功能
点击次数:49 次 发布日期:2008-11-09 08:38:20 作者:源代码网
|
源代码网推荐 解决思路 源代码网推荐 首先利用屏幕拷贝捕捉到当前整个屏幕的图像,然后在内存中保存为 BMP文件格式。压缩时,使用 TCompressionStream对象对原始图像进行压缩并且保存为自定义的文件格式;解压缩时,使用 TDecompressionStream对象对被压缩的图像进行解压缩,还原为 BMP格式的图像文件。 源代码网推荐 具体实现 源代码网推荐 新建一个项目文件,在主单元的接口部分引用 Zlib.pas,在主表单上放置两个按钮 Button1、 Button2,在它们的 OnClick事件中写上相应的过程调用代码。 源代码网推荐 部分程序源代码如下: 源代码网推荐 unit Unit1; 源代码网推荐 interface 源代码网推荐 uses 源代码网推荐 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Zlib; 源代码网推荐 type 源代码网推荐 TForm1 = class(TForm) 源代码网推荐 Button1: TButton; 源代码网推荐 Button2: TButton; 源代码网推荐 procedure Button1Click(Sender: TObject); 源代码网推荐 procedure Button2Click(Sender: TObject); 源代码网推荐 private 源代码网推荐 { Private declarations } 源代码网推荐 public 源代码网推荐 { Public declarations } 源代码网推荐 end; 源代码网推荐 var 源代码网推荐 Form1: TForm1; 源代码网推荐 implementation 源代码网推荐 {$ R* .DFM} 源代码网推荐 1.捕捉全屏幕图像 源代码网推荐 procedure GetScreen(var Bmp: TBitmap); 源代码网推荐 var 源代码网推荐 Dc: HDC; 源代码网推荐 MyCanvas: TCanvas; 源代码网推荐 MyRect: TRect; 源代码网推荐 begin 源代码网推荐 Dc := GetWindowDC(0); 源代码网推荐 MyCanvas := TCanvas.Create; 源代码网推荐 try 源代码网推荐 MyCanvas.Handle := Dc; 源代码网推荐 MyRect:=Rect(0, 0,Screen.Width, Screen.Height); 源代码网推荐 //图像为 24位真彩色,也可根据实际需要调整 源代码网推荐 Bmp.PixelFormat := pf24bit; 源代码网推荐 Bmp.Width := MyRect.Right; 源代码网推荐 Bmp.Height := MyRect.Bottom; 源代码网推荐 //捕捉整个屏幕图像 源代码网推荐 Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect); 源代码网推荐 finally 源代码网推荐 MyCanvas.Handle := 0; 源代码网推荐 MyCanvas.Free; 源代码网推荐 ReleaseDC(0, Dc); 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 2.压缩图像 源代码网推荐 procedure CompressBitmap(var CompressedStream: TMemoryStream;const CompressionLevel: TCompressionLevel); 源代码网推荐 var 源代码网推荐 SourceStream: TCompressionStream; 源代码网推荐 DestStream: TMemoryStream; 源代码网推荐 Count: Integer; 源代码网推荐 Begin 源代码网推荐 //获得图像流的原始尺寸 源代码网推荐 Count := CompressedStream.Size; 源代码网推荐 DestStream := TMemoryStream.Create; 源代码网推荐 SourceStream:=TCompressionStream.Create 源代码网推荐 (CompressionLevel, DestStream); 源代码网推荐 Try 源代码网推荐 //SourceStream中保存着原始的图像流 软件开发网 www.mscto.com 源代码网推荐 CompressedStream.SaveToStream(SourceStream); 源代码网推荐 //将原始图像流进行压缩, DestStream中保存着压缩后的图像流 源代码网推荐 SourceStream.Free; 源代码网推荐 CompressedStream.Clear; 源代码网推荐 //写入原始图像的尺寸 源代码网推荐 CompressedStream.WriteBuffer(Count, SizeOf 源代码网推荐 (Count)); 源代码网推荐 //写入经过压缩的图像流 源代码网推荐 CompressedStream.CopyFrom(DestStream, 0); 源代码网推荐 finally 源代码网推荐 DestStream.Free; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 3.还原被压缩图像 源代码网推荐 procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); 源代码网推荐 var 源代码网推荐 SourceStream: TDecompressionStream; 源代码网推荐 DestStream: TMemoryStream; 源代码网推荐 Buffer: PChar; 源代码网推荐 Count: Integer; 源代码网推荐 Begin 源代码网推荐 //从被压缩的图像流中读出原始图像的尺寸 源代码网推荐 CompressedStream.ReadBuffer(Count, SizeOf(Count)); 源代码网推荐 //根据图像尺寸大小为将要读入的原始图像流分配内存块 源代码网推荐 GetMem(Buffer, Count); 源代码网推荐 DestStream := TMemoryStream.Create; 源代码网推荐 SourceStream := TDecompressionStream.Create(CompressedStream); 源代码网推荐 Try 源代码网推荐 //将被压缩的图像流解压缩,然后存入 Buffer内存块中 源代码网推荐 SourceStream.ReadBuffer(Buffer^, Count); 源代码网推荐 //将原始图像流保存至 DestStream流中 源代码网推荐 DestStream.WriteBuffer(Buffer^, Count); 源代码网推荐 DestStream.Position := 0;//复位流指针 源代码网推荐 //从 DestStream流中载入原始图像流 源代码网推荐 Bmp.LoadFromStream(DestStream); 源代码网推荐 finally 源代码网推荐 FreeMem(Buffer); 源代码网推荐 DestStream.Free; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 4.压缩按钮 OnClick事件 源代码网推荐 procedure TForm1.Button1Click(Sender: TObject); 源代码网推荐 var 源代码网推荐 Bmp: TBitmap; 源代码网推荐 CompressedStream: TMemoryStream; 源代码网推荐 begin 源代码网推荐 Bmp := TBitmap.Create; 源代码网推荐 CompressedStream := TMemoryStream.Create; 源代码网推荐 Try 源代码网推荐 //捕获当前整个屏幕 ,将图像保存至 Bmp对象中 GetScreen(Bmp); 源代码网推荐 //将 Bmp对象中的图像保存至内存流中 源代码网推荐 Bmp.SaveToStream(CompressedStream); 源代码网推荐 //按缺省的压缩比例对原始图像流进行压缩 源代码网推荐 CompressBitmap(CompressedStream, clDefault); 源代码网推荐 //将压缩之后的图像流保存为自定义格式的文件 源代码网推荐 CompressedStream.SaveToFile(‘ C:cj.dat’ ); 源代码网推荐 finally 源代码网推荐 Bmp.Free; 源代码网推荐 CompressedStream.Free; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 5.解压缩按钮 OnClick事件 源代码网推荐 procedure TForm1.Button2Click(Sender: TObject); 源代码网推荐 var 源代码网推荐 CompressedStream: TFileStream; 源代码网推荐 Bmp: TBitmap; 源代码网推荐 begin 源代码网推荐 Bmp := TBitmap.Create; 源代码网推荐 //以文件流的只读方式打开自定义的压缩格式文件 源代码网推荐 CompressedStream := TFileStream.Create(‘ C:cj.dat’ , fmOpenRead); 源代码网推荐 Try 源代码网推荐 //将被压缩的图像流进行解压缩 源代码网推荐 UnCompressBitmap(CompressedStream, Bmp); 源代码网推荐 //将原始图像流还原为指定的 BMP文件 源代码网推荐 Bmp.SaveToFile(‘ C:cj.bmp’ ); 源代码网推荐 finally 源代码网推荐 Bmp.Free; 源代码网推荐 CompressedStream.Free; 源代码网推荐 end; 源代码网推荐 end; 源代码网推荐 源代码网推荐 此外 TCompressionStream对象还提供了 CompressionRate属性,该属性用于描述对原始数据进行压缩后的压缩比率,而 OnProgress事件在压缩与解压缩过程中都会被触发,开发人员可以在该事件中编写用于显示进度的代码。 源代码网推荐 源代码网推荐 以上代码在 Delphi 5.0中调试运行通过。 源代码网推荐 源代码网供稿. |
