2012-12-17 11 views
6

Jak wyczyścić obraz TJPEGImage?Jak wyczyścić obraz jpeg?

Sztuczka JPG.Width := 0 nie zadziała. Nie chcę również tworzyć pustej bitmapy (0x0 pikseli) i przypisywać jej do jpeg.

+4

Jeśli nie chcesz, aby zwolnić obiekt, ale nie chcesz, aby zajmował już pamięć, a potem co chcesz zrobić? –

+0

@Rob. Zostanie ponownie wykorzystane później. Wiele razy. W każdym razie powód nie ma znaczenia. Po prostu ciekawy, czy obraz można wyczyścić BEZ zużywania dodatkowych zasobów (tworzenie nowych obiektów, jak sugeruje bummi). – Ampere

+0

Ja też nie widzę, co trzymasz, jeśli chcesz usunąć wszystko. Co pozostało, gdy obraz zniknął? Jaki jest stan? –

Odpowiedz

9

Można użyć coś takiego (The umieszczoną klasa używany jest tutaj, aby uzyskać dostęp do chronionych metod):

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

Cool. Dzięki. W górę głosowania i zaakceptowane. :) – Ampere

+0

Nie ma za co! ;-) – TLama

3

Jeśli nie chcesz korzystać z używaniem FreeAndNIL i zachować obraz pusty ...

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

@Altar: Myślę, że masz na myśli "w moim pytaniu/w pierwotnym pytaniu", a nie "w PO". OP (= oryginalny plakat) to ty. –

+1

To nie jest rozwiązanie. Nie jest bardziej efektywny niż uwolnienie i odtworzenie oryginalnego obrazu JPEGImage (a tak naprawdę jest mniej, ponieważ stworzyłeś nowy obiekt bez żadnego powodu, poza tym, że go wyrzucisz). Chociaż pierwotne pytanie nie ma sensu, proponowane przez ciebie rozwiązanie ma jeszcze mniej sensu. (Nie ignorując, BTW, po prostu nie rozumiem.) –

+0

@ KenWhite, zgadzam się, jedyny powód, dla którego bym mógł zobaczyć, może być podobny do: początek EmptyJPG (FMyMyReadOnlyPropertyJPEG); Showmessage ('set before:' + IntToStr (FMyMyReadOnlyPropertyJPEG.CompressionQuality)) koniec; – bummi

0

miejsce składnik Tshape na tle na komponent TImage

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

Jak to jest związane z moim pytaniem? – Ampere