Как замедлить анимированный 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);
    }
}
Другие вопросы по тегам