1

我想以某种方式将加载有图像的 zip 文件提取到内存中。我真的不在乎它们进入什么类型的流,只要我之后可以加载它们。我对流没有那么深刻的理解,关于这个主题的解释似乎也没有很详细。

本质上,我现在正在做的是将文件提取到 (getcurrentdir + '\temp\')。这有效,但不是我想要做的。我会更乐意让 jpg 最终出现在内存中,然后能够从内存中读取到 TImage.bitmap。

我目前正在使用 jclcompresion 来处理 zip 和 rars,但正在考虑回到 system.zip,因为我真的只需要能够处理 zip 文件。如果继续使用 jclcompression 会更容易,尽管这对我有用。

4

1 回答 1

6

TZipFile类的read方法可以与流一起使用

procedure Read(FileName: string; out Stream: TStream; out LocalHeader: TZipHeader); overload;
procedure Read(Index: Integer; out Stream: TStream; out LocalHeader: TZipHeader); overload;

从这里您可以使用索引或文件名访问压缩文件。

检查这个使用TMemoryStream保存未压缩数据的示例。

uses
  Vcl.AxCtrls,
  System.Zip;

procedure TForm41.Button1Click(Sender: TObject);
var
  LStream    : TStream;
  LZipFile   : TZipFile;
  LOleGraphic: TOleGraphic;
  LocalHeader: TZipHeader;
begin
  LZipFile := TZipFile.Create;
  try
    //open the compressed file
    LZipFile.Open('C:\Users\Dexter\Desktop\registry.zip', zmRead);
    //create the memory stream
    LStream := TMemoryStream.Create;
    try
      //LZipFile.Read(0, LStream, LocalHeader); you can  use the index of the file
      LZipFile.Read('SAM_0408.JPG', LStream, LocalHeader); //or use the filename 
      //do something with the memory stream
      //now using the TOleGraphic to detect the image type from the stream
      LOleGraphic := TOleGraphic.Create;
      try
         LStream.Position:=0;
         //load the image from the memory stream
         LOleGraphic.LoadFromStream(LStream);
         //load the image into the TImage component
         Image1.Picture.Assign(LOleGraphic);
      finally
        LOleGraphic.Free;
      end;
    finally
      LStream.Free;
    end;
  finally
   LZipFile.Free;
  end;
end;
于 2012-06-13T16:16:46.960 回答