请教各位大哥有关图片流压缩的问题。请问怎么进行图片库中的二进制图片流进行压缩啊并且压缩后还是于二进制存进去,压缩后的图片还是可见的。请提供有关的资料或函数也可以。谢谢了。[red][/red]
解决方案 »
- 几十万上百万的数据,多级分类如何设定?
- 为什么我发的帖子没人回,还不许我删?
- 哪位大侠在线,问个关于RAVE报表的问题
- 如何将一个access数据库文件mdb1.mdb中的a表复制到access数据库文件mdb2.mdb 中。请教高手!!
- 我想发布我的一个软件。
- 编译器的智商?
- 我用delphi编程,但工作中有时要看vc的源码。。大家知道哪里有VC6.0的入门书籍可以下载吗?
- 请问哪位大侠有flv.ocx的控件
- delphi 中例子 midas login
- D7比对程序出错,大虾帮忙..
- DELPHI中使用WEBBROWSER来浏览网页,如何隐藏浏览的地址.
- 写了一个成功完成多层应用程序大量用户数据并发提交的控件
但是压缩后在没有解压的情况下不能看图片 。
Delphi数据的压缩处理原理
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文件。下面本文以压缩一个屏幕拷贝为例介绍如何使用这项功能。//2.压缩图像
procedure CompressBitmap(var CompressedStream: TMemoryStream;
const CompressionLevel: TCompressionLevel);stdcall;
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
Begin
//获得图像流的原始尺寸
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create(CompressionLevel, DestStream);
Try
//SourceStream中保存着原始的图像流
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); stdcall;
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;