Анимированный 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# обеспечивает прямой доступ к любому кадру, который открывает дополнительные возможности для пользовательского отображения
