Как замедлить анимированный GIF
У меня есть приложение WinForms, которое отображает анимированный GIF самым простым способом - есть PictureBox, который загружает.gif напрямую.
Код, сгенерированный дизайнером WinForms, выглядит следующим образом:
//
// pictureBoxHomer
//
this.pictureBoxHomer.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
this.pictureBoxHomer.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBoxHomer.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxHomer.Image")));
this.pictureBoxHomer.Location = new System.Drawing.Point(3, 3);
this.pictureBoxHomer.Name = "pictureBoxHomer";
this.pictureBoxHomer.Size = new System.Drawing.Size(905, 321);
this.pictureBoxHomer.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.pictureBoxHomer.TabIndex = 0;
this.pictureBoxHomer.TabStop = false;
Изображение, конечно, это: http://media.tumblr.com/tumblr_m1di1xvwTe1qz97bf.gif
Проблема: хотя этот анимированный GIF-файл удивительным образом отображается в браузере, он слишком быстро работает в приложении WinForms, что не так радует, как нужно. Так:
Вопрос: есть ли способ замедлить анимированный GIF-файл в приложении WinForms?
2 ответа
Я считаю, что ответ скорее связан с изображением, чем с C#. Если вы отредактируете это конкретное изображение в таком инструменте, как GIMP, и посмотрите на слои, вы увидите, что это композиция из 10 слоев (кадров), но между ними не установлено "время задержки" - оно имеет (0 мс) в слоях. приписывать. Вы можете отредактировать атрибут слоя и изменить его, щелкнув по нему правой кнопкой мыши и выбрав этот параметр в меню. Конечно, в конце вы должны экспортировать новое изображение и сохранить его в формате GIF, выбрав "анимированный" в настройках.
Я полагаю, что в этом случае (когда не указано время задержки между кадрами) веб-браузер и C# PicutureBox принудительно устанавливают свои собственные значения по умолчанию. Итак, если вы установите задержку, скажем, 100 мс, как описано здесь в шаге 3, анимация замедлится.
Для дальнейшего использования можно переопределить время задержки GIF в графическом окне. Вот грубый пример:
public partial class Form1 : Form
{
private FrameDimension dimension;
private int frameCount;
private int indexToPaint;
private Timer timer = new Timer();
public Form1()
{
InitializeComponent();
dimension = new FrameDimension(this.pictureBox1.Image.FrameDimensionsList[0]);
frameCount = this.pictureBox1.Image.GetFrameCount(dimension);
this.pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);
timer.Interval = 100;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
indexToPaint++;
if(indexToPaint >= frameCount)
{
indexToPaint = 0;
}
}
void pictureBox1_Paint(object sender, PaintEventArgs e)
{
this.pictureBox1.Image.SelectActiveFrame(dimension, indexToPaint);
e.Graphics.DrawImage(this.pictureBox1.Image, Point.Empty);
}
}