2012-12-17 61 views
6

如何清除TJPEGImage圖像?如何清除JPEG圖像?

JPG.Width := 0技巧將無法正常工作。 另外,我不想創建一個空的位圖(0x0像素),並將其分配給jpeg。

+4

如果你不想釋放對象的背景T形部件,但你不想讓它佔用內存,那麼你想保留什麼? –

+0

@Rob。它將在稍後重用。多次。無論如何,原因並不重要。我只是很好奇,如果圖像可以被清除而不消耗額外的資源(像bummi所建議的那樣創建新對象)。 – Ampere

+0

如果您想刪除所有內容,我也無法看到您保留的內容。圖像已經剩下了什麼?那裏有什麼狀態? –

回答

9

您可以使用這樣的事情(插入類在這裏用來訪問受保護的方法):

type 
    TJPEGImage = class(jpeg.TJPEGImage); 

implementation 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    JPEGImage: TJPEGImage; 
begin 
    JPEGImage := TJPEGImage.Create; 
    try 
    // this should recreate the internal bitmap 
    JPEGImage.NewBitmap; 
    // this should recreate the internal image stream 
    JPEGImage.NewImage; 
    // here the memory used by the image should be released 
    finally 
    JPEGImage.Free; 
    end; 
end; 
+1

很酷。謝謝。投票並接受。 :) – Ampere

+0

不客氣! ;-) – TLama

3

如果你不想使用FreeAndNil和保持圖像空...

Procedure EmptyJPG(jpg:TJpegImage); 
var 
j:TJpegImage; 
begin 
    j := TJpegImage.Create; 
    try 
    jpg.Assign(j); 
    finally 
    j.Free; 
    end; 
end; 
+2

@Altar:我認爲你的意思是'在我的問題/原始問題'中,而不是'在OP中'。 OP(=原始海報)就是你。 –

+1

這不是一個解決方案。它不會比釋放和重新創建原始JPEGImage更高效(實際上並不如此,因爲您現在無需任何理由創建一個新對象,除非將其丟棄)。雖然原來的問題沒有意義,但您提出的解決方案更不合理。 (不是downvoting,BTW;只是看不到這一點。) –

+0

@KenWhite,完全同意,我會看到的唯一原因可能類似於: 開始 EmptyJPG(FMyMyReadOnlyPropertyJPEG); Showmessage('set before:'+ IntToStr(FMyMyReadOnlyPropertyJPEG.CompressionQuality)) end; – bummi

0

發生在TImage組件

Image1 : Timage 
. 
. 
Image1.Picture.Graphic.Assign(nil); 
+0

這與我的問題有什麼關係? – Ampere