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方法返回 a PStream,您应该真正确定是否有必要,并尝试使其返回TStream。在您提供的代码的上下文中使用PStreamover没有任何优势。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实例。您的原始代码每次调用时都会引入两次内存泄漏。我上面的修订版会自行清理干净。

于 2012-05-19T18:11:46.520 回答
5

你说

PStream 只是一个指向 TStream 的指针

在这种情况下,此代码

MyJpeg.LoadFromStream(@ImageStream);

不能工作。您正在将TStream一个指向 TStream 指针的指针传递给 type 的参数。要使您的代码编译,您需要将 a 传递TStreamLoadFromStream. 像这样:

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 回答