2012-05-19 35 views
2

我有一個保存在字符串中的jpeg文件。我想將字符串加載/分配給Delphi7中的TImage。我用KOL以下代碼:KOL - 將PStream加載到TImage

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只是一個指針T流... 但沒有在TImage中顯示圖片... 感謝您的幫助:)

+2

在這裏,我們再次...什麼「不工作」是什麼意思?它以什麼方式「在這裏失敗」?你沒有提供你的問題的必要信息。任何時候你輸入「錯誤」,「失敗」或「不起作用」,你應該輸入的**接下來的事情**正是你的意思,包括你收到的**精確**錯誤信息與他們包含的任何內存地址。我們無法從我們所在的位置看到您的屏幕,也無法看到您的其他代碼。請幫助我們來幫助你。 (而且,就像提示一樣,你應該在* ImageStream.Write之後重置'ImageStream.Position' *,而不是在它之前。) –

+0

我編輯它。謝謝。問題在於Timage沒有顯示圖片。 –

+2

你不是在讀我寫的東西。我會大膽的這次:**你應該重置'ImageStream。位於'ImageStream.Write'之後,而不是之前。** –

回答

5

幽州

PStream僅僅是T流

在這種情況下,該代碼

MyJpeg.LoadFromStream(@ImageStream); 

不能工作的指針。您正在向類型爲TStream的參數傳遞指向TStream指針的指針。爲了讓你的代碼編譯,你需要通過TStreamLoadFromStream。就像這樣:

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。

+0

大衛,我們發佈了相同的答案(似乎你在發佈我的文章之前發佈了你的答案)。我應該刪除我的答案,因爲它表面上是一樣的嗎? – LaKraven

+0

@LaKraven無需刪除你的。我剛剛投了票。事實上,你的是我的幾秒鐘之前。如果你贏了,我可能會刪除我的,因爲我今天已經在代表帽了。 –

+0

這個效果更好。非常感謝你。 –

7

您將指針傳遞給指向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實例都沒有。每次調用時,您的原始代碼都會引入兩次內存泄漏。我上面修改後的版本自行清理完畢。

+0

Timage不知道它是哪張圖片。它必須首先分配給一個JPEG或位圖。甚至沒有Picture.LoadFromStream ...只有Picture.Bitmap.LoadFromStream –

+0

它可能只是一個Delphi 7的東西。當我做'Image1.Picture.LoadFromStream(SomeStream);''SomeStream'包含一個JPEG圖像時,圖像加載正確。從Delphi 2009到現在,我一直都是這樣。多年以來沒有使用Delphi 7,所以不記得它是否應該適用於您。 – LaKraven

+0

感嘆... Delphi7 ... –