我有一个保存在字符串中的 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/