上一篇:全透明窗体(效果比较好… >>
Delphi数据压缩处理(1)
Delphi数据压缩处理(1)
Borland公司推出的 RAD开发工具 Delphi 5.0作为 Windows平台上的主流开发工具,其可视化的开发环境和面向对象编程的强大功能已经吸引了无数的开发人员。但是,一些程序员在实际的开发过程中却时常为对大量的数据进行压缩而伤透脑筋,不得不去查找一些高效的压缩算法或在网上查找第三方的控件来实现压缩。难道 Delphi本身没有提供这个功能吗?其实 Delphi的程序设计师早就考虑到了这一点,他们提供了 Zlib.pas和 Zlibconst.pas两个单元文件来解决数据压缩问题,实现了很高的数据压缩比率。这两个文件保存在 Delphi 5.0安装光盘上 \Info\Extras\Zlib目录下,此外,在 Info\Extras\Zlib\Obj目录中还保存了 Zlib.pas单元引用的 Obj文件。下面本文以压缩一个屏幕拷贝为例介绍如何使用这项功能。
解决思路
首先利用屏幕拷贝捕捉到当前整个屏幕的图像,然后在内存中保存为 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);
file://图像为 24位真彩色,也可根据实际需要调整
Bmp.PixelFormat := pf24bit;
Bmp.Width := MyRect.Right;
Bmp.Height := MyRect.Bottom;
file://捕捉整个屏幕图像
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
file://获得图像流的原始尺寸
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create
(CompressionLevel, DestStream);
Try
file://SourceStream中保存着原始的图像流
CompressedStream.SaveToStream(SourceStream);
file://将原始图像流进行压缩, DestStream中保存着压缩后的图像流
SourceStream.Free;
CompressedStream.Clear;
file://写入原始图像的尺寸
CompressedStream.WriteBuffer(Count, SizeOf
(Count));
file://写入经过压缩的图像流
CompressedStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
end;
3.还原被压缩图像
procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;
下一篇:Delphi的压缩流与解压流 >>
相关文章:
- · 用Visual C++设计“精灵”窗体
- · Visual C++程序设计中的API和SDK
- · 在应用程序中播放声音资源文件
- · VC++中利用/GS开关防止缓冲区溢出
- · C++之父B.Stroustrup近期…
- · 对今年内将出版的几本C+…
- · VC不是梦想,C++需要自由…
- · 微软新任VisualC++设计师…
- · 恶魔和梦魇的私语------…
- · PolicyTool—策略文件创建和管理工具
- · 获取远程网卡MAC地址。
- · Loki库读解-为TypeList添足:最远基类、最近基类、类型的排序
- · 编程语言的层次观点——…
- · C++杂思录——风格的选…
- · VCStudio使用技巧大全2.…
- · [推荐]VC入门的一条路--…
- · 一个软件测试工程师的加…
- · WebServices带来了什么
- · Mschart控件图象打印处理
- · 用ASP打开远端MDB文件的方法
- · 关于COM中的复合文档
- · 面向对象与现代软件组件系统(V0.02)
- · 我的ATL/ADO编程的曲折经…
- · STL知识准备:1.C++关键字…
- · 对象标准COM和CORBA论长…
- · COM初学者必看,否则你会…
- · 利用ATL制作程序多媒体封…
- · 怎样用VC在容器端取得Ac…
- · 实现photoshop魔棒效果的源代码.
- · 转:GetCodecClsid--提供多种转换功能的GDIPLUS
- · SoftICEforWIN95中文命令解说(三)
- · SoftICEforWIN95中文命令解说(二)
- · 利用VC++实现WIN95/NT下…
- · 如何在用户区显示一张位…
- · 透明位图
- · MFC基础--怎样贴一张圆型…
- · 让你的窗口透明起来
- · combobox控件的使用
