2013-02-28 21 views
7

Demo poniżej próbuje wyciągnąć GIF-y na płótnie formularza. To nie działa. Obraz nie przesuwa się. Jak to działa?Jak wyodrębnić ramki z TGifImage w bitmapy?

procedure TForm1.FormCreate(Sender: TObject); 
begin 
GIF := TGIFImage.Create; 
GIF.LoadFromFile('c:\2.gif'); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
GIF.Free; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
VAR i: Integer; 
begin 
REPEAT 
    for i:= 0 to GIF.Images.Count-1 DO 
    begin 
    DisplayGifFrame(i); 
    Sleep(30); 
    end; 
UNTIL FALSE; 
end; 


procedure TForm1.DisplayGifFrame(AIndex: Integer); 
VAR 
    Renderer: TGIFRenderer; 
begin 
Renderer := TGIFRenderer.Create(GIF); 
TRY 
    Renderer.Animate := TRUE; 
    Renderer.FrameIndex := AIndex; 
    Renderer.Draw(Canvas, Canvas.ClipRect); 

    {save frame in a bitmap here. save bitmap to disk} 
    // xxx 
FINALLY 
    Renderer.Free; 
end; 
end; 

Co chcę osiągnąć:
chcę wyodrębnić wszystkie klatki z GIF i umieścić każdą klatkę w wyjątkowej bitmapy.


Aktualizacja:
Ciąg dalszy tutaj: Cannot draw GIF on dynamically created TBitmap(s)

+1

Jakie jest dokładnie twoje pytanie? Jaki masz problem z opublikowanym przez Ciebie kodem? Co nie działa tak, jak można się spodziewać? Spróbuj przeczytać swoje pytanie z naszego punktu widzenia, pamiętając, że nie wiemy absolutnie nic o tym, co twój kod próbuje zrobić, co myślisz, że powinien robić, ani żadnych informacji o tym, co nie działa. Następnie zmodyfikuj i dodaj więcej szczegółów, abyśmy mogli uzyskać pomoc. :-) –

+0

Nie wiem, kto przegrywa tak szybko, ale proszę, przestań. Daj temu plakatowi kilka minut, aby odpowiedzieć na komentarze i naprawić pytanie przed podjęciem decyzji o zgładzeniu, szczególnie gdy ludzie już o to poprosili. @Altar: "To nie działa" oznacza absolutnie nic dla nikogo oprócz Ciebie. ** Ponownie przeczytaj moją ostatnią uwagę **. –

+0

Pytanie zaktualizowane. Dzięki Ken za uspokojenie stada :) – Ampere

Odpowiedz

8

Spróbuj tego:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    GIF: TGIFImage; 
    Bitmap: TBitmap; 
    I: Integer; 
    GR: TGIFRenderer; 
    R: TRect; 
begin 
    GIF := TGIFImage.Create;  
    Bitmap := TBitmap.Create; 
    try 
    GIF.LoadFromFile('c:\test\test.gif'); 
    Bitmap.SetSize(GIF.Width, GIF.Height); 
    GR := TGIFRenderer.Create(GIF); 
    try 
     for I := 0 to GIF.Images.Count - 1 do 
     begin 
     if GIF.Images[I].Empty then Break; 
     GR.Draw(Bitmap.Canvas, Bitmap.Canvas.ClipRect); 
     GR.NextFrame; 
     Bitmap.SaveToFile(Format('%.2d.bmp', [I])); 
     end; 
    finally 
     GR.Free; 
    end; 
    finally 
    GIF.Free; 
    Bitmap.Free; 
    end; 
end; 

Powyższy kod bierze pod Disposal metody rachunku ramki. zobacz powiązane pytanie here.

+0

Po prostu z ciekawości, czy to też działa z obrazami GIF z przeplotem? – TLama

+1

Nie, 'Aktualizacja' nie pomoże. Nie ma żadnych "komunikatów rysowania", które muszą zostać przetworzone przed rozpoczęciem rysowania. Malowanie na płótnie jest zasadniczo natychmiastowe. 'Update' informuje okno, że powinno ono od razu samo się zamalować, ale oznacza to, że narysuje ono swoje płótno, co i tak robi' GR.Draw'. –

+3

@Altar Chcesz zapisać ramki bitmapy w swoim początkowym Q. Nie rozumiem teraz, jaki jest twój cel. – kobik

Powiązane problemy