我有一个保存在字符串中的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中没有显示图片...感谢您的帮助:)
发布于 2012-05-20 02:12:07
你所说的
PStream只是一个指向TStream的指针
在这种情况下,此代码
MyJpeg.LoadFromStream(@ImageStream);不能工作。您正在向TStream类型的参数传递指向TStream的指针的指针。要编译您的代码,需要向LoadFromStream传递一个TStream。如下所示:
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-20 02:11:47
您正在传递一个指向TStream子代的指针的指针。在调用LoadFromStream时,需要取消对ImageStream变量的引用。请参见下面的代码示例:
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实例。您的原始代码在每次调用时都会引入两个内存泄漏。我上面修改过的版本会在自我清理后自动清理。
https://stackoverflow.com/questions/10667340
复制相似问题