2011-11-23 41 views
6

Szukam biblioteki animacji .NET C# gif (nie musi być za darmo), która pozwoli mi pobrać plik gif i dołączyć do niego ramkę jpeg lub jeszcze jeden plik GIF. Będę również musiał dodać opóźnienie zmiany między ramkami. W odpowiedzi na podobne pytania zazwyczaj odwołujemy się do podstawowej biblioteki, która pozwala tylko na dodanie stałego opóźnienia między obrazami statycznymi.zaawansowana biblioteka gif

+0

Został zamknięty, ponieważ, jak się go zapytało, był duplikatem. Nie wspomniałeś o konieczności zmiany opóźnienia między ramkami lub o tym, że znalazłeś poprzednie odpowiedzi, które nie spełniały twoich potrzeb. :) –

+0

Zgadzam się, po prostu nie spodziewałem się, że tak szybko się zamknie :) –

+2

Proszę nie podpisywać swoich postów. –

Odpowiedz

7

Skończyłem modyfikowanie kodu http://www.codeproject.com/KB/GDI-plus/NGif.aspx, aby uzyskać to, czego potrzebowałem i zadziałało! :)

do przenoszenia pliku źródłowego gif dodałem tą metodą:

 private bool AddGifFrames(Image image) 
    { 
     // implementation 

     var fd = new FrameDimension(image.FrameDimensionsList[0]); 
     int frameCount = image.GetFrameCount(fd); 

     var frames = new List<Tuple<int, Image>>(); 

     if (frameCount > 1) 
     { 
      frames = new List<Tuple<int, Image>>(); 

      //0x5100 is the property id of the GIF frame's durations 
      //this property does not exist when frameCount <= 1 
      byte[] times = image.GetPropertyItem(0x5100).Value; 

      for (int i = 0; i < frameCount; i++) 
      { 
       //selects GIF frame based on FrameDimension and frameIndex 
       image.SelectActiveFrame(fd, i); 

       //length in milliseconds of display duration 
       int length = BitConverter.ToInt32(times, 4 * i); 

       //save currect image frame as new bitmap 
       frames.Add(new Tuple<int, Image>(length, new Bitmap(image))); 
      } 
     } // Not animated 

     foreach (var frame in frames) 
     { 
      HandleFrame(frame.Item2, frame.Item1); 
     } 

     return true; 
    } 

i jak dla niestandardowych opóźnień Mam zmodyfikował tę metodę:

 protected void WriteGraphicCtrlExt(int? delay) 
    { 
     Fs.WriteByte(0x21); // extension introducer 
     Fs.WriteByte(0xf9); // GCE label 
     Fs.WriteByte(4); // data block size 
     int transp, disp; 
     if (Transparent == Color.Empty) 
     { 
      transp = 0; 
      disp = 0; // dispose = no action 
     } 
     else 
     { 
      transp = 1; 
      disp = 2; // force clear if using transparent color 
     } 
     if (Dispose >= 0) 
     { 
      disp = Dispose & 7; // user override 
     } 
     disp <<= 2; 

     // packed fields 
     Fs.WriteByte(Convert.ToByte(0 | // 1:3 reserved 
            disp | // 4:6 disposal 
            0 | // 7 user input - 0 = none 
            transp)); // 8 transparency flag 

     WriteShort(delay ?? Delay); // delay x 1/100 sec 
     Fs.WriteByte(Convert.ToByte(TransIndex)); // transparent color index 
     Fs.WriteByte(0); // block terminator 
    } 

Podsumowując - ten kod może dodać gif jako ramkę, dzieląc ją na ramki i dodając je, a także może dodać niestandardowe opóźnienia.