2012-12-17 59 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