1

画像がロードされたzipファイルを何らかの方法でメモリに抽出したいと考えています。後でロードできる限り、どのタイプのストリームに入るかはあまり気にしません。私はストリームについてそれほど理解していません。また、この件に関する説明はあまり詳しく説明されていないようです。

基本的に、私が今行っていることは、ファイルを (getcurrentdir + '\temp\') に抽出することです。これは機能しますが、私がやりたいことではありません。jpg をメモリに格納してから、メモリから TImage.bitmap に読み込むことができればもっとうれしいです。

現在、jclcompresion を使用して zip と rar を処理していますが、実際には zip ファイルのみを処理できる必要があるため、system.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 に答える