アニメーション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つの問題があります。
- 最後のループは、速度が4ではなく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つは速度を表示したいと思います。