2013-02-28 8 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; 

क्या मैं हासिल करना चाहते हैं।


अद्यतन:
यहाँ जारी रहेगा: Cannot draw GIF on dynamically created TBitmap(s)

+1

तो आपका प्रश्न वास्तव में क्या है? आपके द्वारा पोस्ट किए गए कोड के साथ आपको क्या समस्या है? आप क्या उम्मीद कर रहे हैं काम नहीं कर रहा है? अपने प्रश्न को हमारे दृष्टिकोण से पढ़ने का प्रयास करें, याद रखें कि हम आपके कोड को करने का प्रयास करने के बारे में बिल्कुल कुछ नहीं जानते हैं, आपको क्या लगता है कि यह करना चाहिए, या काम करने के बारे में कोई जानकारी नहीं है। फिर कृपया अधिक जानकारी संपादित करें और जोड़ें ताकि हम कोशिश कर सकें और आपको सहायता प्राप्त कर सकें। :-) –

+0

मुझे नहीं पता कि कौन जल्दी से डाउनवॉटिंग कर रहा है, लेकिन कृपया रुकें। टिप्पणियों का जवाब देने के लिए पोस्टर को कुछ मिनट दें और डाउनवोट का निर्णय लेने से पहले प्रश्न को ठीक करें, खासकर जब लोग पहले से ही ऐसा करने के लिए कह चुके हैं। @Altar: "यह काम नहीं करता है" का अर्थ है किसी के लिए बिल्कुल कुछ भी नहीं। ** कृपया मेरी आखिरी टिप्पणी फिर से पढ़ें **। –

+0

प्रश्न अद्यतन। झुंड को शांत करने के लिए धन्यवाद केन :) – 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

जिज्ञासा से बाहर, क्या यह अंतःस्थापित जीआईएफ छवियों के साथ भी काम करेगा? – TLama

+1

नहीं, 'अपडेट' मदद नहीं करेगा। ड्राइंग से पहले "ड्रॉ ​​संदेश" नहीं हैं जिन्हें संसाधित करने की आवश्यकता होती है। एक कैनवास के लिए चित्रकारी अनिवार्य रूप से तत्काल है। 'अपडेट' एक विंडो को बताता है कि इसे तुरंत खुद को पेंट करना चाहिए, लेकिन इसका मतलब यह है कि यह अपने कैनवास को आकर्षित करेगा, जो कि' GR.Draw' वैसे भी कर रहा है। –

+3

@Altar आप अपने प्रारंभिक प्रश्न में फ्रेम बिटमैप्स को सहेजना चाहते थे। मुझे नहीं पता कि अब आपका उद्देश्य क्या है। – kobik

संबंधित मुद्दे