Анимированный GIF
Анимированным GIF-файлом C# можно легко управлять. Отображение анимированных GIF-файлов в C# стало невероятно простым, начиная с .NET Framework 2.0. Необходимы параметры для отображения анимированного GIF-файла, автоматически обрабатываемого платформой .NET Framework, или вручную для точного управления анимацией изображения.
Автоматический способ — C# PictureBox
Первым способом отображения анимированного GIF-файла в C# является использование элемента управления PictureBox. Установив свойство Image элемента управления PictureBox в анимированный GIF-файл, PictureBox автоматически отобразит анимацию:
1 2 |
pictureBox1.Image = Image.FromFile("C:/Images/animated.gif"); |
C# делает вещи такими простыми, не так ли? Недостатком этого метода является то, что вы, как программист, не имеете никакого контроля над FPS (кадрами в секунду) анимации или над тем, как она зацикливается.
Если вы хотите справиться с этими вещами самостоятельно, нам нужен код C# для ручного доступа к кадрам в анимации.
Ручной способ — Извлечение кадров
Есть две вещи, которые нам нужны для обработки анимированных GIF с чисто C# кодом. Для обоих потребуется пространство имен System.Drawing.Imaging.
Сначала нам нужно подсчитать общее количество кадров в анимированном GIF. Используйте комбинацию классов Image и FrameDimension:
1 2 3 |
Image gifImage = Image.FromFile(path); FrameDimension dimension = new FrameDimension(gifImage.FrameDimensionsList[0]); int frameCount = gifImage.GetFrameCount(dimension); |
Вторая часть заключается в фактическом доступе к нужному кадру. Используйте следующую строку кода:
1 2 |
gifImage.SelectActiveFrame(dimension, index); |
Анимированный класс GIF C#
Сейчас мы создадим класс C#, который будет автоматически обрабатывать извлечение кадров из анимированных GIF-файлов C#.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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# обеспечивает прямой доступ к любому кадру, который открывает дополнительные возможности для пользовательского отображения