2013-02-28 18 views
7

Aşağıdaki demo, formun tuvalindeki GIF'yi çizmeye çalışır. Çalışmıyor. Görüntü ilerlemeyecek. Nasıl çalıştırılır?
Bir GIF gelen tüm çerçeveleri ayıklamak ve EŞSİZ bitmap İÇİNDE her kareyi koymak istiyorum:Bir TGifImage'den Bitmap'lere kareler nasıl çıkarılır?

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; 

elde etmek istiyorum ne.


Güncelleme:
burada devam etti: Cannot draw GIF on dynamically created TBitmap(s)

+1

Sorunuz tam olarak nedir? Gönderdiğiniz kodla ilgili sorun nedir? Ne beklediğiniz gibi çalışmıyor? Sorularınızı bizim açımızdan okumaya çalışın, kodunuzun ne yapmaya çalıştığını, ne yaptığınızı düşündüğünüzü veya neyin çalışmadığına dair herhangi bir bilgi olmadığını kesinlikle hatırlayın. Daha sonra lütfen yardım edip yardım alabilmemiz için daha fazla ayrıntıyı düzenleyin ve ekleyin. :-) –

+0

Kimin bu kadar çabuk düşürdüğünü bilmiyorum ama lütfen dur. Özellikle insanların zaten bunu yapmalarını istediğinde, reddetmeye karar vermeden önce yorumlara yanıt vermek ve soruyu düzeltmek için postere birkaç dakika verin. @Altar: "İşe yaramıyor", kesinlikle sizden başka kimseye hiçbir şey ifade etmiyor. ** Lütfen son yorumumu tekrar oku **. –

+0

Soru güncellendi. Sürüyü sakinleştirmek için teşekkürler Ken :) – Ampere

cevap

8

bu deneyin:

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; 

Yukarıdaki kod hesap Çerçevesinin Disposal yöntem haline sürer. ilgili soruya bakınız here.

+0

Sadece meraktan, bu da taramalı GIF görüntüleri ile çalışacak mı? – TLama

+1

Hayır, 'Güncelle 'yardımcı olmaz. Çizmeden önce işlenmesi gereken "çizim mesajları" yoktur. Bir tuvale resim yapmak hemen önümüzde. 'Update', hemen kendisini boyaması gereken bir pencereyi anlatıyor, ancak tüm bu anlama geldiğinde, bu, 'GR.Draw' nin zaten yaptığı gibi tuvaline çizeceği anlamına geliyor. –

+3

@Altar İlk Q'nize kare bitmap'leri kaydetmek istediniz. Şimdi hedefinizin ne olduğunu anlamıyorum. – kobik

İlgili konular