C# Отображение анимированного GIF-файла в WinForms

Анимированный GIF

Анимированным GIF-файлом C# можно легко управлять. Отображение анимированных GIF-файлов в C# стало невероятно простым, начиная с .NET Framework 2.0. Необходимы параметры для отображения анимированного GIF-файла, автоматически обрабатываемого платформой .NET Framework, или вручную для точного управления анимацией изображения.

Автоматический способ — C# PictureBox

Первым способом отображения анимированного GIF-файла в C# является использование элемента управления PictureBox. Установив свойство Image элемента управления PictureBox в анимированный GIF-файл, PictureBox автоматически отобразит анимацию:

pictureBox1.Image = Image.FromFile("C:/Images/animated.gif");

C# делает вещи такими простыми, не так ли? Недостатком этого метода является то, что вы, как программист, не имеете никакого контроля над FPS (кадрами в секунду) анимации или над тем, как она зацикливается.

Если вы хотите справиться с этими вещами самостоятельно, нам нужен код C# для ручного доступа к кадрам в анимации.

Ручной способ — Извлечение кадров

Есть две вещи, которые нам нужны для обработки анимированных GIF с чисто C# кодом. Для обоих потребуется пространство имен System.Drawing.Imaging.

Сначала нам нужно подсчитать общее количество кадров в анимированном GIF. Используйте комбинацию классов Image и FrameDimension:

Image gifImage = Image.FromFile(path);
FrameDimension dimension = new FrameDimension(gifImage.FrameDimensionsList[0]);
int frameCount = gifImage.GetFrameCount(dimension);

Вторая часть заключается в фактическом доступе к нужному кадру. Используйте следующую строку кода:

gifImage.SelectActiveFrame(dimension, index);

Анимированный класс GIF C#

Сейчас мы создадим класс C#, который будет автоматически обрабатывать извлечение кадров из анимированных GIF-файлов C#.

public class GifImage
{
    private Image gifImage;
    private FrameDimension dimension;
    private int frameCount;
    private int currentFrame = -1;
    private bool reverse;
    private int step = 1;

    public GifImage(string path)
    {
        gifImage = Image.FromFile(path); //инициализировать
        dimension = new FrameDimension(gifImage.FrameDimensionsList[0]); //получает идентификатор GUID
        frameCount = gifImage.GetFrameCount(dimension); //всего кадров в анимации
    }

    public bool ReverseAtEnd //Должен ли GIF воспроизводиться в обратном направлении, когда он достигает конца
    {
        get { return reverse; }
        set { reverse = value; }
    }

    public Image GetNextFrame()
    {

        currentFrame += step;

        //если анимация достигает границы...
        if (currentFrame >= frameCount || currentFrame < 1)
        {
            if (reverse)
            {
                step *= -1; //... Обратный счетчик
                currentFrame += step; //apply it
            }
            else
                currentFrame = 0; //...или начать все сначала
        }
        return GetFrame(currentFrame);
    }

    public Image GetFrame(int index)
    {
        gifImage.SelectActiveFrame(dimension, index); //найти frame
        return (Image)gifImage.Clone(); //вернуть его копию
    }
}

 

‎Заключение‎

‎Есть несколько вещей, которые следует иметь в виду. Функция ‎‎SelectActivateFrame‎‎ C# изменяет тот же объект Image, и в этом случае необходимо вызвать метод ‎‎Clone()‎‎ перед возвратом нового фрайма.‎

‎Приведенный выше класс C# для отображения анимированных GIF-файлов также показывает небольшой пример возможностей ручного извлечения кадров из GIF. Одна из них заключается в том, что кадры отображаются в обратном порядке, когда анимация достигает конца. Функция GetFrame C# обеспечивает прямой доступ к любому кадру, который открывает дополнительные возможности для пользовательского отображения

Обновлено: 08.01.2022 — 16:49

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.