从zip文件中提取图像到内存 Delphi

rkue9o1l  于 2023-08-04  发布在  其他
关注(0)|答案(2)|浏览(124)

我想提取一个压缩文件加载到内存中的图像以某种方式。我并不关心它们进入什么类型的流,只要我可以在之后加载它们。我对流没有太多的理解,关于这个主题的解释似乎也没有太多的细节。
本质上,我现在做的是将文件解压缩到(getcurrentdir + '\temp')。这是可行的,但不是我想做的。我会更高兴的是,jpg的结束在内存中,然后能够从内存读取到TIMage.bitmap。
我目前正在使用jclcompression来处理zip和rars,但正在考虑搬回system.zip,因为我真的只需要能够处理zip文件。如果继续使用jclcompression会更容易一些,那对我来说也是可行的。

a11xaf1n

a11xaf1n1#

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;

pw136qt2

pw136qt22#

对RRUZ来说,该流是Read函数的OUT参数。所以你一定不能执行一个创建(LStream:= TMemoryStream.Create;)如果您这样做了,则说明您发生了内存泄漏。

相关问题