You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
4.6 KiB
188 lines
4.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.Diagnostics;
|
|
using System.Timers;
|
|
|
|
namespace KaiwaProjects
|
|
{
|
|
public class GifImage : IDisposable
|
|
{
|
|
private KpImageViewer KpViewer;
|
|
private Image gif;
|
|
private FrameDimension dimension;
|
|
private int frameCount;
|
|
private int rotation = 0;
|
|
private int currentFrame = 0;
|
|
private Bitmap currentFrameBmp = null;
|
|
private Size currentFrameSize = new Size();
|
|
private bool updating = false;
|
|
private Timer timer = null;
|
|
private double framesPerSecond = 0;
|
|
private bool animationEnabled = true;
|
|
|
|
public Size CurrentFrameSize
|
|
{
|
|
get
|
|
{
|
|
return currentFrameSize;
|
|
}
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Lock();
|
|
timer.Enabled = false;
|
|
gif.Dispose();
|
|
gif = null;
|
|
Unlock();
|
|
|
|
timer.Dispose();
|
|
}
|
|
|
|
public double FPS
|
|
{
|
|
get { return (1000.0 / framesPerSecond); }
|
|
set
|
|
{
|
|
if (value <= 30.0 && value > 0.0)
|
|
{
|
|
framesPerSecond = 1000.0 / value;
|
|
|
|
if (timer != null)
|
|
{
|
|
timer.Interval = framesPerSecond;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool AnimationEnabled
|
|
{
|
|
get { return animationEnabled; }
|
|
set
|
|
{
|
|
animationEnabled = value;
|
|
|
|
if (timer != null)
|
|
{
|
|
timer.Enabled = animationEnabled;
|
|
}
|
|
}
|
|
}
|
|
|
|
public GifImage(KpImageViewer KpViewer, Image img, bool animation, double fps)
|
|
{
|
|
this.updating = true;
|
|
this.KpViewer = KpViewer;
|
|
this.gif = img;
|
|
this.dimension = new FrameDimension(gif.FrameDimensionsList[0]);
|
|
this.frameCount = gif.GetFrameCount(dimension);
|
|
this.gif.SelectActiveFrame(dimension, 0);
|
|
this.currentFrame = 0;
|
|
this.animationEnabled = animation;
|
|
|
|
this.timer = new Timer();
|
|
|
|
this.updating = false;
|
|
|
|
framesPerSecond = 1000.0 / fps; // 15 FPS
|
|
this.timer.Enabled = this.animationEnabled;
|
|
this.timer.Interval = framesPerSecond;
|
|
this.timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
|
|
|
|
this.currentFrameBmp = (Bitmap)gif;
|
|
this.currentFrameSize = new Size(currentFrameBmp.Size.Width, currentFrameBmp.Size.Height);
|
|
}
|
|
|
|
void timer_Elapsed(object sender, ElapsedEventArgs e)
|
|
{
|
|
NextFrame();
|
|
}
|
|
|
|
public bool Lock()
|
|
{
|
|
if (updating == false)
|
|
{
|
|
while (updating)
|
|
{
|
|
// Wait
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void Unlock()
|
|
{
|
|
updating = false;
|
|
}
|
|
|
|
public void NextFrame()
|
|
{
|
|
try
|
|
{
|
|
if (gif != null)
|
|
{
|
|
if (Lock())
|
|
{
|
|
lock (gif)
|
|
{
|
|
gif.SelectActiveFrame(this.dimension, this.currentFrame);
|
|
currentFrame++;
|
|
|
|
if (currentFrame >= this.frameCount)
|
|
{
|
|
currentFrame = 0;
|
|
}
|
|
|
|
OnFrameChanged();
|
|
}
|
|
}
|
|
|
|
Unlock();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
System.Windows.Forms.MessageBox.Show(ex.ToString());
|
|
}
|
|
}
|
|
|
|
public int Rotation
|
|
{
|
|
get { return rotation; }
|
|
}
|
|
|
|
public void Rotate(int rotation)
|
|
{
|
|
this.rotation = (this.rotation + rotation) % 360;
|
|
}
|
|
|
|
private void OnFrameChanged()
|
|
{
|
|
this.currentFrameBmp = (Bitmap)gif;
|
|
this.currentFrameSize = new Size(currentFrameBmp.Size.Width, currentFrameBmp.Size.Height);
|
|
|
|
this.KpViewer.InvalidatePanel();
|
|
}
|
|
|
|
public Bitmap CurrentFrame
|
|
{
|
|
get
|
|
{
|
|
return currentFrameBmp;
|
|
}
|
|
}
|
|
|
|
public int FrameCount
|
|
{
|
|
get { return frameCount; }
|
|
}
|
|
}
|
|
}
|