Delphi紧缩流宽和压流的运用-Delphi-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝33
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:286回复:0

  Delphi紧缩流宽和压流的运用

楼主#
更多 发布于:2016-06-04 16:37

软件开发者

不免都要遇到紧缩数据的疑问!

经常

运用Delphi的兄弟都知道,它为咱们供给了两个流类(TCompressionStream和TDecompressionStream)来

完成数据的紧缩宽和紧缩,但美中缺少的是,该流在Delphi 的帮忙中没有

翔实的

注明,使得它们在

运用起来有

定然得

困难 。其

实在Delphi体系中供给了这两个类的源代码和库 。

保存在Delphi 光盘的InfoExtraslib

Src和InfoExtraslibObj目录中(其间OBJ目录中

保存的是库,Src目录中

保存的是源代码,有爱好的兄弟

能够看看) 。自己在

运用的进程中,对它们有了

定然的了解 。

一、 类的

注明

1、 基类 TCustomZlibStream:类TCustomZlibStream

是类TCompressionStream和TDecompressionStream 类的基类,它首要有一个特点:

OnProgress,在类进行紧缩或解紧缩的进程中会

发生这个的事情 ,它的界说如下:

给拍摄初学者的劝告 别太把相机当回事开放百变的魅力 秋季人像拍摄实战指南

安卓手机怎样给GPS加快定位怎样远离安卓歹意软件

Procedure OnProgress (Sender: TObject);

dynamic;

2、

紧缩类TCompressionStream:类TCompressionStream除了承继了基类的 OnProgress

特点外,又添加了一个特点:CompressionRate,它的界说如下:

Property CompressionRate: Single read

GetCompressionRate;经过这个特点,

能够得到紧缩比 。

5个拍摄小窍门 教你拍好逆光清新少女10个要点 教你怎样拍出柔美的逆光少女

拍摄入门 怎样运用线条及黄金分割构图ipad3怎样越狱,iPad3完美越狱教程

它的几个首要的

进程界说如下:

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 "

异常 。需要紧缩的数据经过

进程 Write写入流中,在写入的进程中就被紧缩,并

保存在由

结构函数供给的内存流(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;

该进程首先从得到的数据流中

取得位图巨细,并请求内存空间,

然后

构建解压流,并将解压数据

保存到位图流中,

然后显现到屏幕上 。

这篇文章程序在Delphi6.0中调试经过 。

软件开发者

不免都要遇到紧缩数据的疑问!

经常

运用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 "

异常 。需要紧缩的数据经过

进程 Write写入流中,在写入的进程中就被紧缩,并

保存在由

结构函数供给的内存流(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;

该进程首先从得到的数据流中

取得位图巨细,并请求内存空间,

然后

构建解压流,并将解压数据

保存到位图流中,

然后显现到屏幕上 。

这篇文章程序在Delphi6.0中调试经过 。

优质IT资源分享社区为你提供此文。
本站有大量优质Delphi教程视频,资料等资源,包含Delphi基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

 

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客