首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KOL -将PStream加载到TImage

KOL -将PStream加载到TImage
EN

Stack Overflow用户
提问于 2012-05-20 01:19:07
回答 2查看 432关注 0票数 2

我有一个保存在字符串中的jpeg文件。我想将该字符串加载/分配给Delphi7中的TImage。我在下面的代码中使用KOL

代码语言:javascript
复制
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中没有显示图片...感谢您的帮助:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-20 02:12:07

你所说的

PStream只是一个指向TStream的指针

在这种情况下,此代码

代码语言:javascript
复制
MyJpeg.LoadFromStream(@ImageStream);

不能工作。您正在向TStream类型的参数传递指向TStream的指针的指针。要编译您的代码,需要向LoadFromStream传递一个TStream。如下所示:

代码语言:javascript
复制
MyJpeg.LoadFromStream(ImageStream^);

处于您的位置,我可能会使用这样的TStringStream

代码语言:javascript
复制
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。

票数 5
EN

Stack Overflow用户

发布于 2012-05-20 02:11:47

您正在传递一个指向TStream子代的指针的指针。在调用LoadFromStream时,需要取消对ImageStream变量的引用。请参见下面的代码示例:

代码语言:javascript
复制
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对象!

改用下面的代码:

代码语言:javascript
复制
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实例。您的原始代码在每次调用时都会引入两个内存泄漏。我上面修改过的版本会在自我清理后自动清理。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10667340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档