Ben*_*iss 2 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;
Run Code Online (Sandbox Code Playgroud)
它应该工作,因为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;
Run Code Online (Sandbox Code Playgroud)
如果你的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;
Run Code Online (Sandbox Code Playgroud)
我不知道你为什么要创建一个TJpegImage实例.您的原始代码每次调用时都会引入两次内存泄漏.我上面的修订版本正确地清理了.
你陈述了
PStream只是指向TStream的指针
在这种情况下这个代码
MyJpeg.LoadFromStream(@ImageStream);
Run Code Online (Sandbox Code Playgroud)
无法工作.您正在向类型参数传递TStream指向TStream指针的指针.要使代码编译,您需要传递TStream给LoadFromStream.像这样:
MyJpeg.LoadFromStream(ImageStream^);
Run Code Online (Sandbox Code Playgroud)
在你的位置,我可能会使用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;
Run Code Online (Sandbox Code Playgroud)
也许有一种KOL方法可以做到这一点,我根本不知道KOL.