首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zlib充气示例

Zlib充气示例
EN

Stack Overflow用户
提问于 2016-03-21 09:46:40
回答 1查看 1.1K关注 0票数 0

我想要一个Delphi或Pascal的Zlib Inflate/Deflate代码的例子,因为在整个网络上我找不到C/C++中的it...Everywhere its。

我浏览了所有可用的资源,并找到了以下内容:

代码语言:javascript
复制
procedure ZDecompress(const inBuffer: Pointer; inSize: Integer;
  out outBuffer: Pointer; out outSize: Integer; outEstimate: Integer);
var
  zstream: TZStreamRec;
  delta: Integer;
begin
  FillChar(zstream, SizeOf(TZStreamRec), 0);

  delta := (inSize + 255) and not 255;

  if outEstimate = 0 then outSize := delta
  else outSize := outEstimate;

  GetMem(outBuffer, outSize);

  try
    zstream.next_in := inBuffer;
    zstream.avail_in := inSize;
    zstream.next_out := outBuffer;
    zstream.avail_out := outSize;

    ZDecompressCheck(InflateInit(zstream));

    try
      while ZDecompressCheck(inflate(zstream, Z_NO_FLUSH)) <> Z_STREAM_END do
      begin
        Inc(outSize, delta);
        ReallocMem(outBuffer, outSize);

        zstream.next_out := PChar(Integer(outBuffer) + zstream.total_out);
        zstream.avail_out := delta;
      end;
    finally
      ZDecompressCheck(inflateEnd(zstream));
    end;

    ReallocMem(outBuffer, zstream.total_out);
    outSize := zstream.total_out;
  except
    FreeMem(outBuffer);
    raise;
  end;
end;

我假设这个程序是用来充气的。对于同样的目的,你的大师有什么建议的代码和程序吗?

EN

回答 1

Stack Overflow用户

发布于 2016-04-20 02:02:29

使用,system.ZLib;

代码语言:javascript
复制
     TWadItem = Class
                 private


                      _UncompressedData:TMemoryStream;
                      _CompressedData:TMemoryStream;

                  public

                  public

                  Procedure Pack;
                  procedure unpack;
...

procedure TWadItem.Pack;
var
    lz:TZCompressionStream;
begin
    if _CompressedData<>nil then exit;
    if _UnCompressedData=nil then exit;
    if _Uncompresseddata.Size<1 then exit;
    _CompressedData:=TMemoryStream.Create;
    _UnCompressedData.Seek(0,0);


    lz:=TZCompressionStream.Create(TCompressionLevel.clMax,_CompressedData);
    lz.CopyFrom(_UnCompressedData,_UnCOmpressedData.Size);
    LZ.Free;
    _UnCompressedData.free;
    _UnCompressedData:=NIL;

end;
procedure TWadItem.unpack;
var
    lz:TZDeCompressionStream;
    buff:TBytes;
begin
    if _UnCompressedData<>nil then exit;
    if _CompressedData=nil then exit;

    _UnCompressedData:=TMemoryStream.Create;

    lz:=TZDeCompressionStream.Create(_CompressedData);
    _unCompressedData.CopyFrom(lz,0);
    LZ.Free;

    _CompressedData.Seek(0,0);

    _unCompressedData.Seek(0,0);
   // _unCompressedData.SaveToFile(ExtractFilePath(ParamStr(0))+'Decompress.bmp');
    _unCompressedData.Seek(0,0);
    //freeandNIl(_CompressedData);
    _CompressedData.Free;
    _CompressedData:=NIL;

end;
constructor TWadItem.create;
begin
      self._UncompressedData:=nil;
      self._CompressedData:=nil;
end;

function TWadItem.CreateBitmap: TBitmap;
begin
    result:=TBitmap.Create;
    self.ReadToBitmap(result);
end;

function TWadItem.CurrentlyCompressed: Boolean;
begin
      result:=false;
      if self._CompressedData<>nil then result:=true;
      if self._UncompressedData<>nil then result:=False;

end;

destructor TWadItem.destroy;
begin
     try
        _UncompressedData.Free;
     except
            on exception do begin end;
     end;
     try
        _CompressedData.Free;
     except on exception do begin end;
     end;

end;

procedure TWadItem.AssignFromBitmap(FromBMP: TBitmap);
begin
      UnPack;
      if _UnCompressedData=nil then
      begin
        _UnCompressedData:=TMemoryStream.Create;
        _UnCompressedData.Clear;
      end;
      _UncompressedData.SetSize(0);
      _UnCompressedData.Seek(0,0);
      FromBMP.SaveToStream(_UnCompressedData);

end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36121924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档