2

jpegファイルを文字列で保存しています。Delphi7のTImageに文字列をロード/割り当てたいのですが。私は次のコードにKOLを使用しています。

var
 ImageStream : PStream;
 ImageString : String;
 MyJpeg      : TJpeg;
begin
 ImageStream:= NewMemoryStream; // Create New Stream.
 ImageStream.Write(ImageString [1], Length(ImageString )); // Fill the stream.
 ImageStream.Position := 0;     // Set Position to 0.
 // ImageStream.SaveToFile('C:\test.jpg', 0, ImageStream.Size); // Debug --> WORKS!
 MyJpeg := TJpegImage.Create; // Create a Jpeg Image. 
 MyJpeg.LoadFromStream(@ImageStream); // ???
 Image1.picture.Assign(MyJpeg);       // No picture is shown
end;

PStreamはTStreamへの単なるポインタなので、機能するはずです...しかし、Timageには画像が表示されません...ご協力いただきありがとうございます:)

4

2 に答える 2

7

TStreamの子孫へのポインターへのポインターを渡します。ImageStreamを呼び出すときは、変数を逆参照する必要がありますLoadFromStream。以下のコードサンプルを参照してください。

var
 ImageStream : PStream;
 ImageString : String;
 MyJpeg      : TJpeg;
begin
 ImageStream:= NewMemoryStream; // Create New Stream.
 ImageStream.Write(ImageString [1], Length(ImageString )); // Fill the stream.
 ImageStream.Position := 0;     // Set Position to 0.
 // ImageStream.SaveToFile('C:\test.jpg', 0, ImageStream.Size); // Debug --> WORKS!
 MyJpeg := TJpegImage.Create; // Create a Jpeg Image. 
 MyJpeg.LoadFromStream(ImageStream^); // Dereference PStream to TStream
 Image1.picture.Assign(MyJpeg);       // Your picture is now shown
end;

NewMemoryStreamメソッドがを返す場合はPStream、それが必要かどうかを実際に判断し、代わりに返すようにする必要TStreamがあります。提示したコードのコンテキストで使用PStreamすることに利点はありません。TStream

また、あなたはあなたのImageStreamオブジェクトを解放していません!

代わりにこれを使用してください:

var
  ImageStream: TStream;
  ImageString: String;
begin
  ImageStream := NewMemoryStream;
  try
    ImageStream := NewMemoryStream;
    ImageStream.Write(ImageString[1], Length(ImageString));
    ImageStream.Position := 0;

    Image1.Picture.LoadFromStream(ImageStream);
  finally
    ImageStream.Free;
  end;
end;

TJpegImageなぜインスタンスを作成しているのか、まったくわかりません。元のコードでは、呼び出されるたびに2つのメモリリークが発生します。上記の私の改訂版は、それ自体の後で適切にクリーンアップします。

于 2012-05-19T18:11:46.520 に答える
5

あなたはそれを述べます

PStreamはTStreamへの単なるポインタです

この場合、このコード

MyJpeg.LoadFromStream(@ImageStream);

動作しません。タイプのパラメーターに、TStreamTStreamへのポインターへのポインターを渡します。TStreamコードをコンパイルするには、にを渡す必要がありますLoadFromStream。このような:

MyJpeg.LoadFromStream(ImageStream^);

あなたの立場では、私はおそらくTStringStreamこのようなものを使用します。

var
  Stream: TStringStream;
....
Stream := TStringStream.Create(ImageString);
try
  MyJpeg := TJpegImage.Create;
  try
    MyJpeg.LoadFromStream(Stream);
    Image1.Picture.Assign(MyJpeg);
  finally
    MyJpeg.Free;
  end;
finally
  Stream.Free;
end;

おそらくそれを行うためのKOLの方法があります、私はKOLをまったく知りません。

于 2012-05-19T18:12:06.840 に答える