我有一个保存在字符串中的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中没有显示图片...... 谢谢你的帮助:)
答案 0 :(得分:7)
您正在将指针传递给指向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
实例。您的原始代码每次调用时都会引入两次内存泄漏。我上面的修订版本正确地清理完毕。
答案 1 :(得分:5)
你说明了
PStream只是指向TStream的指针
在这种情况下这段代码
MyJpeg.LoadFromStream(@ImageStream);
无法正常工作。您正在向类型TStream
的参数传递指向TStream指针的指针。要编译代码,您需要将TStream
传递给LoadFromStream
。像这样:
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。