jpg.SaveToStream(m1); //将JPG图象写入流中
    jpg.free;如果用ZLIB对流进行压缩与解压缩呀?

解决方案 »

  1.   

    这方面文章很多,可以自已找一下。压缩图像     procedure CompressBitmap(var CompressedStream: TMemoryStream;const 
          CompressionLevel: TCompressionLevel); 
        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; 还原被压缩图像 
       procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: 
          TBitmap); 
       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; 
      

  2.   

    //Zlib的使用
    uses
      ZLib, Classes;procedure Compress(CompressedStream: TMemoryStream);
    var
      SourceStream: TCompressionStream;
      DestStream: TMemoryStream;
      Count: Integer;
    begin
      Count := CompressedStream.Size;
      DestStream := TMemoryStream.Create;
      SourceStream := TCompressionStream.Create(clMax, DestStream);
      try
        CompressedStream.SaveToStream(SourceStream);
        SourceStream.Free;
        CompressedStream.Clear;
        CompressedStream.WriteBuffer(Count, SizeOf(Count));
        CompressedStream.CopyFrom(DestStream, 0);
      finally
        DestStream.Free;
      end;
    end;procedure UnCompress(CompressedStream: TMemoryStream);
    var
      SourceStream: TDecompressionStream;
      DestStream: TMemoryStream;
      Buffer: PChar;
      Count: integer;
    begin
      CompressedStream.Seek(0, soFromBeginning);
      CompressedStream.ReadBuffer(Count, SizeOf(Count));
      GetMem(Buffer, Count);
      DestStream := TMemoryStream.Create;
      SourceStream := TDecompressionStream.Create(CompressedStream);
      try
        SourceStream.ReadBuffer(Buffer^, Count);
        DestStream.WriteBuffer(Buffer^, Count);
        DestStream.Position := 0;
        CompressedStream.LoadFromStream(DestStream);
      finally
        FreeMem(Buffer);
        DestStream.Free;
      end;
    end;
      

  3.   

    JPG图像本身已经是使用图像压缩技术处理过的,一般可压缩的内容较少,基本上大小已经不能再减多少
      

  4.   

    to hthunter(核桃-我的心在下雨,雨中我和她携手漫步) 其实采用clMax参数进行压缩,压缩率提高不了多少,反倒是压缩耗时却差别相当大,建议还是采用clDefault,必须时采用clFast就足够了。
      

  5.   

    嘻嘻,不过偶用措施也算是比较强硬,因为clNone其实上没用,所以偶通常把它给屏蔽掉,即只给出1、2、3三个选项,例:
    '=================================================================================
    '压缩选项
    Public Enum ZlibCompressionLevel
           ZLIB_CompressionLevel_Fastest = 1 '最快压缩,速度最快,压缩率最低
           ZLIB_CompressionLevel_Default = 2 '默认压缩,速度一般,压缩率相当
           ZLIB_CompressionLevel_Max = 3     '最大压缩,速度最慢,压缩率最高
    End Enum