Анимация изображений в C#
В этом примере показано, как анимировать изображения, загружая их во время выполнения, а затем воспроизводя их по одному.
Чтобы упростить поиск изображений, я добавил их в проект. (Откройте меню «Проект», выберите «Добавить существующий элемент» и выберите изображения.) Затем я выбрал изображения в обозревателе решений и установил их свойства «Копировать в выходной каталог» в «Копировать, если новый», чтобы они были скопированы в исполняемый каталог. Затем программа может легко найти их, указав только имена файлов, а не их пути.
Для анимации изображений первый шаг загружает их. Следующий код показывает, как программа загружает изображения при запуске.
// Изображения кадра. private Bitmap[] Frames; // Индекс текущего кадра. private int FrameNum = 0; // Загружаем изображения. private void Form1_Load(object sender, EventArgs e) { // Загружаем фреймы. Frames = new Bitmap[18]; for (int i = 0; i < 18; i++) { Frames[i] = new Bitmap("Frame" + i + ".png"); } // Отображение первого кадра. picFrame.Image = Frames[FrameNum]; }
Программа сохраняет изображения в массиве Frames. Первоначально он устанавливает FrameNum в 0, поэтому он отображает первый кадр.
Когда форма загружается, программа пеет от 0 до 17 загружает файлы изображений с именами формы Frame0.png, Frame1.png и т. д. Обработчик события Load формы заканчивается, отображая первый кадр в picFrame PictureBox.
Форма программы содержит Timer, который отображает фреймы. Следующий код показывает, как обработчик событий Timer Tick отображает следующий кадр.
// Отображение следующего изображения. private void tmrNextFrame_Tick(object sender, EventArgs e) { FrameNum = ++FrameNum % Frames.Length; picFrame.Image = Frames[FrameNum]; }
Приращение кода FrameNum и принимает результат по модулю числа кадров. Это означает, что FrameNum всегда представляет номер кадра между 0 и самым большим индексом в массиве Frames.
Затем обработчик событий отображает текущий кадр в picFrame PictureBox.
Кнопка запуска программы использует следующий код для запуска или остановки Timer.
// Запуск или остановка анимации. private void btnStartStop_Click(object sender, EventArgs e) { tmrNextFrame.Enabled = !tmrNextFrame.Enabled; if (tmrNextFrame.Enabled) btnStartStop.Text = "Stop"; else btnStartStop.Text = "Start"; }
Конечной частью программы является полоса прокрутки с именем hscrFps. Когда вы изменяете значение полосы прокрутки, следующий код изменяет скорость компонента Timer.
// Установите задержку на кадр. private void hscrFps_Scroll(object sender, ScrollEventArgs e) { tmrNextFrame.Interval = 1000 / hscrFps.Value; lblFps.Text = hscrFps.Value.ToString(); }