在Delphi编程中如何使用数据压缩和解压缩 |
时间:2011-11-29 14:20 作者:o精品 |
| 本文作者: 高恩勇, 谢德银 第21卷第2期沧州师范专科学校学报o.201.212005年6月ournalofangzhoueachersollegeun.2005高恩勇,谢德银(沧州师范专科学校,河北沧州061001)摘要:数据压缩和解压缩,一直是软件技术领域的热门技术,一些程序员曾为数据的压缩和解压缩而费尽心血,在编程时自己按照相应的算法来实现,这样做既费时又费力,在elphi环境下,数据压缩和解压缩变得非常的容易,本文详细介绍了在elphi编程环境下,进行应用开发时传奇之,使用数据压缩和解压缩的技术和方法。关键词:elphi数据压缩数据解压缩组件中图分类号:416文献标识码:文章编号:1008—4762(2005)02—0092—02一、引言在软件开发过程中,为了提高信息的传输速率或减少存储容量,经常需要使用数据压缩和解压缩技术。在使用elphi进行应用开发时如何使用数据压缩和解压缩技术,是否有非常简单的编程方法,是我们大家所关心的—个问题。elphi中提供了两个类流ompressionmeam和decompressiontream,利用这两个类流,可以方便的实现数据压缩和解压缩编程.非常遗憾的传奇文章是elplli的帮助文件中没有提供它们的帮助信息,这就使得我们在使用这两个类流时变得比较困难,但是,在elphi系统中提供了这两个类的源代码和库。保存在elphi光盘的klnfoixtrasklibrc和nfox妇蛇1ib州目录中(其中目录中保存的是库,rc目录中保存的是源代码),本文结合作者应用elphi编程过程中使用数据压缩和解压缩的体会,向大家介绍这两个类流的使用方法。二、ompressiontream和decompression—tream简介1、基类ustomlibtream:类ustomlibtream是类ompressiontream和ecompressiontream类的基类,它主要有一个属性:nrogress,在类进行压缩或解压缩的过程中会发生这个的事件.它的定义如下:rocedurenrogress(ender:bject)dynamic2、压缩类ompressiontrearn:类ompressiontream除了继承了基类的nrogress属性外,又增加了—个属性:ompressionate,它的定义如下:ropertyompressionate:inglereadetompressionate通过这个属性,可以得到压缩比。它的几个重要的方法定义如下:onstructorompressiontream.reate(ompressionevel:ompressionevelest:tream)参数含义:compressionevel(压缩类型),它由如下几个定义:①、clone:不进行数据压缩②、clastest:进行快速压缩。牺牲压缩效率:③、clefault:进行正常压缩④、clax:进行最大化压缩,牺牲速度est:目的流,用于存放压缩过的数据。unctionompressionn伽n.rite(constufferount:ongint):ongint参数含义:uffer:需要压缩的数据ount:需要压缩的数据的字节数函数值:返回写入流的字节数。压缩类ompressiontream的数据只能是写入的,如果试图从其内部读取数据,将发生—个”rror”异常。需要压缩的数据通过方法rite写入流中,在写入的过程中就被压缩,并保存在由构造函数提供的内存流(nlemorys仃e锄)中,同时触发nrocess事件o3、解压缩类ecompressiontream:和压缩类compressiontream相反,它的数据是只能读出的,如果试图往其内部网民真愿意玩写数据,将发生—个”rror”异常。它的几个重要方法定义如下:构造函数:onstructorreate(ource:tream)其中:ource是保存着压缩数据的流unctionead(varufferount:ongint):ongint数据读出函数。uffer:存数据缓冲区ount:缓冲区的大小函数返回读出的字节数。4收稿日期:2004--12一10作者简介:高恩勇(19s6一),男,河北沧州人.副教授,藏要从事计算机的教学与研究澍德银(197卜一),男,河北沧县人,实验师,从事计算机教学与研究。 万·方92数·据三、ompressiontream和decompression—tream的应用通过类ompressiontream和decompressiontream的配合使用,我们可以非常方便地完成数据的压缩和解压,下面就是本人在编写屏幕拷贝程序中的使用例子:过程e架设游戏tcreen得到整个屏幕的图象拷贝,并利用压缩流ourcetream和内存流eststream将位图压缩.并重新把位图大小和压缩数据流保存到位图流中,发送出去,发送位图大小的目的是在解压前来确定需要的内存空间。rocedurelientorm.etcreenarource,est:handle:itap:itapmptream,eststream:emorytream内存流说明ourcetream:ompressiontream,压缩流说明ount:ntegereginource:=reate(display',",",nil)得到屏幕的est:=reateompatible(ource)建立临时handle:=reateompatibleitmap(ource,creen.idth,creen.eight):腱立位图electbjeet(est。handle)选择位图itlt(est,0,0,creen.idth,creen.eight。ource,0,0,)拷贝整个屏幕litap:=itap.reateitap.andle:=handle保存屏幕位图到itap中)mptream:=emorytream.reateitap.aveotream(mptream)建立位图数据的内存流1count:=mptream.ize保存位图的大小)esttream:=emorytream.reatef目标流,保存压缩数据lourcetream:=ompressiontream.reate(clx,esttream)(构建压缩流.采用最大化压缩.并保存到目标流中ltrymptream.aveotream(ourcetream)玉.缩位图流lourcetream.ree完成压缩,释放压缩流)mptream.lear清空原来位图流lmptream.riteuffer(ount.izeof(ount)f将原来位图的大小保存到新的位图流中,以便使用mptream.opyrom(esttream,0)将压缩数据附加到新的位图流后面mptream.osition:=:trm.ostlt(mptream)位图流)finallyeststream.最新传奇reemptream.estroyitap.estroyelete(ource)elease(handle,ource)endf释放有关资源1nd过程erverorm.trmerv首先从得到的数据流中取得位图大小,并申请内存空间,然后建立解压流.并将解压数据保存到位图流中.然后显示到屏幕上。procedureerverorm.tnnerv(ender:omponentconstsrom:tringstrm:tream)attreamtr,esttream:emorytreamourcetream:ecompressiontreamcount:ntegerbuffer:pointerbegincreenlmage.icture.itmap:=nilftrmsemorytreamhentreamtr:=umemoryueamlsexittream廿.osition:=0:treamtr.eaduffer(ount,izeof(ount)f得到位图的大小)etem(uff传奇文章er,ount)(申请数据空间esttream:=emorytream.reateourcetream:=ecompreswsiontream.reate(treamtr)构建解压流,压缩数据由treamtr流得到)tatusar.impleext:=正在处理图象ryourcetream.eaduffer(uffer,ount)渎出解压数据e.tream.riteuffer(uffer,oun0保存到位图流中)esttream.osition:=0:creenlmage.icture.itmap.oadromtream(esttream)显示到屏幕上inallyreeem(uffer)esttream.estroyourcetream.estroyndend责任编辑:允书才1·9寥·。 本文《在Delphi编程中如何使用数据压缩和解压缩》 --- 作者: 高恩勇, 谢德银 |
| --------------------------------------------------------------------------------------- |
| 上一篇:以人为本增强高职院校思想政治教育的实效性 |
| 下一篇:知识产权保护视野下的农业科技档案管理 |
| --------------------------------------------------------------------------------------- |
| 与本站相关文章推荐: |