请教各位大哥有关图片流压缩的问题。请问怎么进行图片库中的二进制图片流进行压缩啊并且压缩后还是于二进制存进去,压缩后的图片还是可见的。请提供有关的资料或函数也可以。谢谢了。[red][/red]

解决方案 »

  1.   

    现存的代码不要做任何修改可以直接使用的,
    但是压缩后在没有解压的情况下不能看图片 。
                
                      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;