2013-02-28 25 views
7

Bản trình diễn bên dưới cố gắng vẽ GIF trên canvas của biểu mẫu. Nó không hoạt động. Hình ảnh sẽ không tiến lên. Làm thế nào để làm cho nó hoạt động?Làm thế nào để trích xuất khung từ một TGifImage thành bitmap?

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; 

Những gì tôi muốn đạt được:
tôi muốn trích xuất tất cả các khung hình từ một GIF và đưa từng khung TRONG MỘT bitmap UNIQUE.


Cập nhật:
Tiếp tục ở đây: Cannot draw GIF on dynamically created TBitmap(s)

+1

Vậy câu hỏi của bạn chính xác là gì? Bạn gặp vấn đề gì với mã bạn đã đăng? Điều gì không hoạt động như bạn mong đợi? Hãy thử đọc câu hỏi của bạn theo quan điểm của chúng tôi, nhớ rằng chúng tôi hoàn toàn không biết gì về mã của bạn đang cố gắng làm gì, bạn nghĩ nó nên làm gì, hoặc bất kỳ thông tin nào về những gì không hoạt động. Sau đó, vui lòng chỉnh sửa và thêm các chi tiết khác để chúng tôi có thể thử và giúp bạn. :-) –

+0

Tôi không biết ai là người downvoting quá nhanh, nhưng hãy dừng lại. Cung cấp cho người đăng một vài phút để trả lời các nhận xét và khắc phục câu hỏi trước khi quyết định giảm giá, đặc biệt là khi mọi người đã yêu cầu họ làm như vậy. @Altar: "Nó không hoạt động" có nghĩa là hoàn toàn không có gì cho bất cứ ai ngoài bạn. ** Vui lòng đọc lại bình luận cuối cùng của tôi **. –

+0

Câu hỏi đã được cập nhật. Cảm ơn Ken vì đã làm dịu đàn bò :) – Ampere

Trả lời

8

Hãy thử điều này:

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; 

Đoạn mã trên sẽ đưa vào phương pháp tài khoản Khung của Disposal. xem câu hỏi liên quan here.

+0

Chỉ vì tò mò, điều này cũng có tác dụng với hình ảnh GIF xen kẽ không? – TLama

+1

Không, 'Cập nhật' sẽ không giúp ích gì. Không có "thông điệp vẽ" cần được xử lý trước khi việc vẽ xảy ra. Vẽ lên vải là cơ bản ngay lập tức. 'Update' cho biết một cửa sổ mà nó sẽ tự vẽ ngay lập tức, nhưng tất cả điều đó có nghĩa là nó sẽ vẽ lên khung vẽ của nó, đó là những gì' GR.Draw' đang làm. –

+3

@Altar Bạn muốn lưu bitmap khung trong Q. ban đầu của bạn Tôi không hiểu mục tiêu của bạn bây giờ là gì. – kobik

Các vấn đề liên quan