расширенная библиотека GIF - PullRequest
6 голосов
/ 23 ноября 2011

Я ищу библиотеку анимации .NET C # gif (необязательно бесплатную), которая позволила бы мне взять файл gif и прикрепить его к фрейму jpeg или даже к другому файлу gif. Мне также нужно будет иметь возможность добавить изменение задержки между кадрами. Ответ на подобные вопросы здесь обычно ссылается на базовую библиотеку, которая позволяет добавлять фиксированную задержку только между статическими изображениями.

1 Ответ

7 голосов
/ 23 ноября 2011

В итоге я изменил http://www.codeproject.com/KB/GDI-plus/NGif.aspx код, чтобы получить то, что мне нужно, и это сработало! :)

для обработки исходного файла gif я добавил этот метод:

        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;
    }

и что касается пользовательских задержек, я изменил этот метод:

        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
    }

Подводя итог - этот код может добавить gif в качестве фрейма, разделив его на фреймы и добавив их, а также может добавить пользовательские задержки.

...