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です。

したがって、animatd gifを表示するときは、ラベルに速度を表示しようとしています。しかし、2つの問題があります。

  1. 最後のループは、速度が4ではなく2になったことを示しています。
  2. 結果のラベルは常に0であり、2/100は0ではありません。

私がやりたいのは、実際の速度を表示することです。プログラムEasygifanimator 5のように:

4から1つの画像の上に立っている場合、その速度は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();
        }
    }
}

すべての画像を選択した後の簡単なgifアニメーターからの画像:

ここに画像の説明を入力してください

最後に、2つのラベルに1つはアニメーションGIFの長さ、もう1つは速度を表示したいと思います。

4

1 に答える 1

0

アニメーション gif の画像をループしているコードの部分に問題があります。だけではなく、ここで 2 つの個別の変数が必要になる場合がありますspeed

だから何か

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

整数計算の問題を解くには、100 ではなく 100.0 で割ります。

label2.Text = (totalDuration / 100.0).ToString();
于 2012-08-09T18:01:56.440 に答える