我如何显示当前的GIF动画速度?

时间:2012-08-09 17:26:32

标签: c#

我有这个课程,我从动画gif获取信息:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;
using System.IO;

public class AnimatedGif
{
    private List<AnimatedGifFrame> mImages = new List<AnimatedGifFrame>();
    public AnimatedGif(string path)
    {
        Image img = Image.FromFile(path);
        int frames = img.GetFrameCount(FrameDimension.Time);
        if (frames <= 1) throw new ArgumentException("Image not animated");
        byte[] times = img.GetPropertyItem(0x5100).Value;
        int frame = 0;
        for (; ; )
        {
            int dur = BitConverter.ToInt32(times, 4 * frame);
            mImages.Add(new AnimatedGifFrame(new Bitmap(img), dur));
            if (++frame >= frames) break;
            img.SelectActiveFrame(FrameDimension.Time, frame);
        }
        img.Dispose();
    }
    public List<AnimatedGifFrame> Images { get { return mImages; } }
}

public class AnimatedGifFrame
{
    private int mDuration;
    private Image mImage;
    internal AnimatedGifFrame(Image img, int duration)
    {
        mImage = img; mDuration = duration;
    }
    public Image Image { get { return mImage; } }
    public int Duration { get { return mDuration; } }
}

然后在构造函数中的Form1中循环遍历图像列表并获取每个图像的持续时间。所以在这种情况下列表中有4个图像,每个图像的持续时间为1。

因此,当我显示动画片gif我试图在标签中显示速度时。 但有两个问题:

  1. 最后的循环告诉我速度现在是2而不是4。
  2. 结果的标签始终为0和2/100不为0.
  3. 我想要做的是显示实际速度。 就像程序Easy gif animator 5:

    如果我站在4的一张图像上我看到它的速度是0.01秒,那么延迟1就是1/100秒。

    如果我在程序中标记所有图像,我的速度为0.04秒。

    也许我在速度和持续时间之间感到困惑。

    我想获得GIF动画的速度。

    这是我在Form1中的代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace MyAnimatedGifEditor
    {
    
    
        public partial class Form1 : Form
        {
            int speed;
            Image myImage;
            AnimatedGif myGif;
    
            public Form1()
            {
                InitializeComponent();
    
                myImage = Image.FromFile(@"D:\fananimation.gif");
                myGif = new AnimatedGif(@"D:\fananimation.gif");
                for (int i = 0; i < myGif.Images.Count; i++)
                {
    
                    speed = myGif.Images[i].Duration;
                    speed++;
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void openToolStripMenuItem_Click(object sender, EventArgs e)
            {
                pictureBox1.Image = myImage;
                label2.Text = (speed / 100).ToString();
            }
        }
    }
    

    选择所有图像后,来自easy gif动画师的图像:

    enter image description here

    最后,我想在两个标签上显示一个动画gif的持续时间和一个速度。

1 个答案:

答案 0 :(得分:0)

您的代码部分中存在问题,您在循环浏览动画gif的图像。您可能需要两个单独的变量,而不仅仅是speed

类似

for (int i = 0; i < myGif.Images.Count; i++)
{
    totalDuration += myGif.Images[i].Duration;
    count++;
}

要解决整数学问题,除以100.0而不是100:

label2.Text = (totalDuration / 100.0).ToString();