9

いくつかの画像ファイルを 1 つのファイル (ある種のアーカイブ) に保存しています。そのファイルは次のようになります。

ここに画像の説明を入力

これは、ヘッダーとデータ セグメントの 2 つのセグメントに分かれています。ヘッダー (緑) には、アルバム名、場所、日付/時刻、説明、アルバム内の写真の数などのさまざまな情報が含まれています。データ セグメント (青とオレンジ) は単純な構造で、N x JPEG の写真が含まれています。その「imagedata」セグメントを新しい TMemoryStream オブジェクトに抽出できるので、TImage を使用してそれを表示したいと考えています。

TMemoryStream のSaveAsFileメソッドを使用して一時ファイル名を設定し、そのファイルを TImage からロードして、後で一時ファイルを削除できます。それは機能しますが、一時を使用せずにそのストリームを TImage に送信する方法はあるのでしょうか。ファイル。

もちろん、ハード ディスク上のすべてのファイルを抽出するコードを作成することはできますが、問題は、このようなアーカイブがたくさんあり、ハード ドライブに 20,000 枚以上の写真を保存する代わりに、これらの「アルバム」を読み取るアプリケーションを作成したいことです。 .

要するに、私が望むのは、次の手順を機能させることだけです(一時ファイルを使用せずに)

procedure ShowImageFromStream(data: TStream; img: TImage);
begin
...
end;

前もって感謝します。

4

1 に答える 1

22

それがあなたが探しているものかどうかはわかりませんが、このコードは JPEG ファイルをストリームから指定された TImage コンポーネントにロードする必要があります。

uses
  JPEG;

procedure ShowImageFromStream(AImage: TImage; AData: TStream);
var
  JPEGImage: TJPEGImage;
begin
  AData.Position := 0;
  JPEGImage := TJPEGImage.Create;
  try
    JPEGImage.LoadFromStream(AData);
    AImage.Picture.Assign(JPEGImage);
  finally
    JPEGImage.Free;
  end;
end;
于 2012-04-17T22:51:25.260 に答える