0

我有这个类,我从动画 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。

我想要做的是显示实际速度。就像在程序 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 animator的图像:

在此处输入图像描述

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

4

1 回答 1

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();
于 2012-08-09T18:01:56.440 回答