2013-02-28 11 views
7

以下のデモでは、フォームのキャンバスにGIFを描画しようとしています。それは動作しません。画像は前進しません。それを動作させるには?私が達成したい何TGifImageからビットマップにフレームを抽出する方法は?

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; 


私はGIFからすべてのフレームを抽出し、UNIQUEビットマップ内の各フレームを載せていきたいと思います。


更新:
ここに続け:Cannot draw GIF on dynamically created TBitmap(s)

+1

あなたの質問は何ですか?投稿したコードにどのような問題がありますか?期待どおりに動かないのは何ですか?あなたのコードが何をしようとしているのか、何がうまくいかないのかについての情報は絶対に何も知らないことを覚えておいてください。その後、私たちがあなたに手伝ってもらうために、詳細を編集して追加してください。 :-) –

+0

私は誰がすぐにdownvotingを知っているが、停止してください。ポスターには、コメントに応答するために数分を与えてください。特に、人々がすでにそうするように依頼したときは、質問を解決してからdownvoteすることをお勧めします。 @Altar:「うまくいきません」とは、あなた以外の誰にも絶対に何も意味しません。 **最後のコメントをもう一度お読みください**。 –

+0

質問が更新されました。群衆を落ち着かせるためにKenに感謝します:) – Ampere

答えて

8

はこれを試してみてください:

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; 

上記のコードは、アカウントのフレームのDisposal方法になります。関連する質問hereを参照してください。

+0

これはインタラクティブなGIF画像でも好奇心から外れますか? – TLama

+1

いいえ、 'Update'は役に立たないでしょう。描画が行われる前に処理する必要がある「描画メッセージ」はありません。キャンバスへのペイントは基本的に即時です。 'Update'は、ウィンドウに直ちにペイントする必要があることをウィンドウに伝えますが、その意味は、キャンバスに描画するということです。これは、' GR.Draw'がやっていることです。 –

+3

@Altar初期のフレームビットマップを保存したかったのですが、私は今あなたの目的が何かを理解していません。 – kobik

関連する問題