delphi - KOL - 将 PStream 加载到 TImage

标签 delphi delphi-7 kol

我有一个保存在字符串中的 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中没有显示图片... 感谢您的帮助:)

最佳答案

您正在将一个指针传递给指向 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根本没有实例。您的原始代码每次调用时都会引入两次内存泄漏。我上面的修订版本可以正确地自行清理。

关于delphi - KOL - 将 PStream 加载到 TImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10667340/

相关文章:

delphi - delphi创建组件模板

delphi - KOL应用程序的主图标

.net - 来自.net背景的Delphi项目层次结构

windows - 如何在 Delphi 中获取 Windows 上的完全限定域名

delphi - Firemonkey TTreeView - 在 TTreeViewItems、TValue 中存储对象引用

ios - 如何在 Delphi XE2 中访问 iOS 加速度计?

delphi - 转换 TStringList 中的特殊字符

delphi - 如何录制声音并延迟播放?