压缩学会Delphi程序压缩程序功能还亲你一个自己的解压软件

解压程序  时间:2021-02-07  阅读:()

软件开发者不免都要遇到压缩数据的问题经常使用Delphi的朋友都知道它为我们提供了两个流类TCompressionStream和TDecompressionStream来完成数据的压缩和解压缩但美中不足的是该流在Delphi的帮助中没有详细的说明使得它们在使用起来有一定得困难。其实在Delphi系统中提供了这两个类的源代码和库。保存在Delphi光盘的InfoExtraslib Src和InfoExtraslibObj目录中其中OBJ目录中保存的是库 Src目录中保存的是源代码感兴趣的朋友可以看看 。本人在使用的过程中对它们有了一定的了解。

一、 类的说明

1、 基类TCustomZlibStream类TCustomZlibStream是类TCompressionStream和

TDecompressionStream类的基类它主要有一个属性 OnProgress在类进行压缩或解压缩的过程中会发生这个的事件它的定义如下

Procedure OnProgress (Sender: TObject) ; dynamic;

2、 压缩类TCompressionStream类TCompressionStream除了继承了基类的OnProgress属性外又增加了一个属性 CompressionRate它的定义如下

Property CompressionRate: Single read GetCompressionRate;通过这个属性可以得到压缩比。

它的几个重要的方法定义如下

Constructor TCompressionStream.Create (CompressionLevel: TCompressionLevel; Dest:TStream) ;

其中 TcompressionLevel 压缩类型 它由如下几个定义

①、 clNone 不进行数据压缩

②、 clFastest进行快速压缩牺牲压缩效率

③、 clDefault进行正常压缩

④、 clMax 进行最大化压缩牺牲速度

Dest 目的流用于存放压缩过的数据。

Function TCompressionStream.Write (const Buffer; Count: Longint) : Longint;

其中 Buffer需要压缩的数据

Count:需要压缩的数据的字节数

函数返回写入流的字节数。

压缩类TCompressionStream的数据只能是写入的如果试图从其内部读取数据将发生一个"Error"异常。需要压缩的数据通过方法Wr i te写入流中在写入的过程中就被压缩并保存在由构造函数提供的内存流TmemoryStream中,同时触发OnProcess事件。

3、解压缩类TDecompressionStream:和压缩类TcompressionStream相反它的数据是只能读出的如果试图往其内部写数据将发生一个"Error "异常。它的几个重要方法定义如下

构造函数 Constructor Create(Source: TStream) ;

其中 Source是保存着压缩数据的流

Function Read(var Buffer; Count: Longint) : Longint;

数据读出函数 Buffer 存数据缓冲区

Count:缓冲区的大小

函数返回读出的字节数。

数据在读出的过程中数据被解压缩并触发OnProcess事件。

二、 类的使用

通过类TCompressionStream和TdecompressionStream的配合使用我们可以非常方便地完成数据的压缩和解压下面就是本人在编写屏幕拷贝程序中的使用例子

Procedure TClientForm.GetScreen;

Var

SourceDC,DestDC:HDC;

Bhandle:HBITMAP;

BitMap:TBitMap;

BmpStream,Deststream:TMemoryStream;

SourceStream:TCompressionStream;

Count:Integer;

Begin

SourceDC:=CreateDC('display' , ' ' , ' ' ,nil) ;

{得到屏幕的DC}

DestDC:=CreateCompatibleDC(SourceDC) ;

{建立临时DC}

Bhandle:=CreateCompatibleBitmap(SourceDC,Screen.Width, Screen.Height) ;

{建立位图}

SelectObject(DestDC,Bhandle) ;

{选择位图DC}

BitBlt(DestDC,0,0,Screen.Width, Screen.Height,SourceDC,0,0,SRCCOPY) ;

{拷贝整个屏幕}

BitMap:=TBitMap.Create;

BitMap.Handle := Bhandle;

{保存屏幕位图到BitMap中}

BmpStream:=TMemoryStream.Create;

BitMap.SaveToStream(BmpStream) ;

{建立位图数据的内存流}count:=BmpStream.Size;

{保存位图的大小}

DestStream:=TMemoryStream.Create;

{目标流保存压缩数据}

SourceStream:=TCompressionStream.Create(clMax, DestStream) ;

{构建压缩流采用最大化压缩并保存到目标流中}try

BmpStream.SaveToStream(SourceStream) ;

{压缩位图流}

SourceStream.Free;

{完成压缩释放压缩流}

BmpStream.Clear;

{清空原来位图流}

BmpStream.WriteBuffer(Count, Sizeof(Count) ) ;

{将原来位图的大小保存到新的位图流中 以便使用}

BmpStream.CopyFrom(DestStream, 0) ;

{将压缩数据附加到新的位图流后面}

BmpStream.Position := 0;

NMStrm.PostIt(BmpStream) ;

{发送位图流}finally

DestStream.Free;

BmpStream.Destroy ;

BitMap.Destroy;

DeleteDC(SourceDC) ;

ReleaseDC(Bhandle,SourceDC) ;end;

{释放有关资源}

End;

该过程得到整个屏幕的图象拷贝并利用压缩流SourceStream和内存流Deststream将位图压缩并重新把位图大小和压缩数据流保存到位图流中发送出去发送位图大小的目的是在解压前来确定需要的内存空间。

procedure TServerForm.NMStrmServMSG(Sender: TComponent;const sFrom: String; strm: TStream) ;

Var

StreamStr,DestStream:TMemoryStream;

SourceStream:TDecompressionStream;count:Integer;buffer:pointer;begin

ScreenImage.Picture.Bitmap:=nil;

If Strm Is TMemoryStream Then

StreamStr := Strm AS TMemoryStream

Else

Exit;

StreamStr.Position := 0;

StreamStr.ReadBuffer(Count, Sizeof(Count) ) ;

{得到位图的大小}

GetMem(Buffer,Count) ;

{申请数据空间}

DestStream := TMemoryStream.Create;

SourceStream := TDecompressionStream.Create(StreamStr) ;{构建解压流压缩数据由StreamStr流得到}

StatusBar.SimpleText := '正在处理图象' ;

Try

SourceStream.ReadBuffer(Buffer^,Count) ;

{读出解压数据}

DestStream.WriteBuffer(Buffer^,Count) ;

{保存到位图流中}

DestStream.Position := 0;

ScreenImage.Picture.Bitmap.LoadFromStream(DestStream) ;{显示到屏幕上}

Finally

FreeMem(Buffer) ;

DestStream.Destroy;

SourceStream.Destroy;

End;end;

该过程首先从得到的数据流中取得位图大小并申请内存空间然后建立解压流并将解压数据保存到位图流中然后显示到屏幕上。delphi压缩与解压 比较简单也比较实用对我来说已经足够我只想让客户端下载一个压缩文件到本地后解压出来就行看网上有用什么控件的我的是delphi6没装那控件在公司管的比较严要装控件比较麻烦。不扯了看代码吧。

[html] viewplain copy

1. unitunzip;

2.

3. interface

4.

5. uses

6. Windows,Messages,SysUti ls,Variants,Classes,Graphics,Controls,

Forms,

7. Dialogs,StdCtrls;

8.

9. ty p e

10. TForm1 =class(TForm)

11. Button 1:TButton;

12. Button2:TButton;

13. procedure Button1Cl ick(Sender:TObject);

14. procedure Button2Cl ick(Sender:TObject);

15. private

16. {Private declarations}

17. publ ic

18. {Publ icdeclarations}

19. end;

20.

21. va r

22. Form1:TForm1;

23.

24. implementation

25.

26. {$R*.dfm}

27.

28. usesZl ib;

29. //压缩函数

30. procedure Zip(var fs:TMemoryStream);

31. va r

32. cs:TCompressionStream;

33. ms:TMemoryStream;

34. num: Integer;

35. begin

36. if not(Assigned(fs)and(fs.Size>0)) then Exit;

37.

38. num:=fs.Size;

39. ms:=TMemoryStream.Create;

40. cs:=TCompressionStream.Create(clMax,ms);

41. try

42. fs.SaveToStream(cs);

43. cs.Free;

44. //ms.Position:=0;

45. fs.Clear;

46. fs.WriteBuffer(num, sizeof(num));

47. fs.CopyFrom(ms,0);

48. final ly

49. m s.Free;

50. end;

51. end;

52.

53. //解压函数

54. procedure UnZip2(var fs:Tmemorystream);

55. va r

56. ds:TDecompressionStream;

57. ms:TMemoryStream;

58. num: Integer;

59. begin

60. if not(Assigned(fs)and(fs.Size>0)) then Exit;

61.

62. fs.Position:=0;

63. fs.ReadBuffer(num,sizeof(num));

64. ms:=TMemoryStream.Create;

65. ds:=TDecompressionStream.Create(fs);

66. try

67. ms.SetSize(num);

68. ds.Read(ms.Memory^,num);

69. //ms.Position:=0;

70. fs.Clear;

71. fs.CopyFrom(ms,0);

72. final ly

73. d s.Free;

74. m s.Free;

75. end;

76. end;

77. //压缩测试

78. procedure TForm1.Button1Cl ick(Sender:TObject);

79. va r

80. ms:TMemoryStream;

81. begin

82. ms:=TMemoryStream.Create;

83. ms.LoadFromFi le('D:\delphi\szcb.mdb');

84. Zip(ms);

85. ms.SaveToFi le('D:\delphi\szcb.zip');

86. end;

87.

88. //解压测试

89. procedure TForm1.Button2Cl ick(Sender:TObject);

90. va r

91. ms:TMemoryStream;

92. begin

93. ms:=TMemoryStream.Create;

94. ms.LoadFromFi le('D:\delphi\szcb.zip');

95. UnZip2(ms);

96. ms.SaveToFi le('D:\delphi\szcb2.mdb');

97. end;

SpinServers(月89美元) 2*e5-2630L v2,美国独立服务器

SpinServers服务商也不算是老牌的服务商,商家看介绍是是2018年成立的主机品牌,隶属于Majestic Hosting Solutions LLC旗下。商家主要经营独立服务器租用和Hybrid Dedicated服务器等,目前包含的数据中心在美国达拉斯、圣何塞机房,自有硬件和IP资源等,商家还自定义支持用户IP广播到机房。看到SpinServers推出了美国独服的夏季优惠促销活动,最低月...

创梦网络-新上雅安电信200G防护值内死扛,无视CC攻击,E5 32核高配/32G内存/1TB SSD/100Mbps独享物理机,原价1299,年未上新促销6折,仅779.4/月,续费同价

创梦网络怎么样,创梦网络公司位于四川省达州市,属于四川本地企业,资质齐全,IDC/ISP均有,从创梦网络这边租的服务器均可以****,属于一手资源,高防机柜、大带宽、高防IP业务,另外创梦网络近期还会上线四川眉山联通、广东优化线路高防机柜,CN2专线相关业务。广东电信大带宽近期可以预约机柜了,成都优化线路,机柜租用、服务器云服务器租用,适合建站做游戏,不须要在套CDN,全国访问快,直连省骨干,大网...

博鳌云¥799/月,香港110Mbps(含10M CN2)大带宽独立服务器/E3/8G内存/240G/500G SSD或1T HDD

博鳌云是一家以海外互联网基础业务为主的高新技术企业,运营全球高品质数据中心业务。自2008年开始为用户提供服务,距今11年,在国人商家中来说非常老牌。致力于为中国用户提供域名注册(国外接口)、免费虚拟主机、香港虚拟主机、VPS云主机和香港、台湾、马来西亚等地服务器租用服务,各类网络应用解決方案等领域的专业网络数据服务。商家支持支付宝、微信、银行转账等付款方式。目前香港有一款特价独立服务器正在促销,...

解压程序为你推荐
weipin唯品金融是什么?大家基本都怎么用呢?支付宝查询余额怎样查支付宝余额arm开发板开发板是什么?如ARM开发板,DSP开发板等。。它和最终目标板有何区别?天天酷跑刷金币天天酷跑怎么刷金币?安装迅雷看看播放器迅雷看看播放器下了安装不了ejb开发EJB是什么?2012年正月十五2012年正月十五上午9点27分出生的女孩儿五行缺什么,命怎么样小米手柄买了个小米蓝牙手柄,游戏是可以玩但是按键位置不舒服,怎么可以改按键服务器连接异常lol为什么总是提示服务器连接异常去鼠标加速度怎样才能彻底去掉鼠标加速度
便宜vps vps租用 国外免费vps 备案域名出售 好看的留言 免费静态空间 绍兴高防 上海域名 卡巴斯基官方免费版 什么是刀片服务器 世界测速 空间合租 河南移动m值兑换 免费网页空间 广州虚拟主机 云服务器比较 登陆qq空间 深圳主机托管 winserver2008 alexa世界排名 更多