问题
How do you split an animated gif into its component parts in .net?
Specifically I want to load them into Image(s) (System.Drawing.Image) in memory.
======================
Based on SLaks' answer i now have this
public static IEnumerable<Bitmap> GetImages(Stream stream)
{
using (var gifImage = Image.FromStream(stream))
{
//gets the GUID
var dimension = new FrameDimension(gifImage.FrameDimensionsList[0]);
//total frames in the animation
var frameCount = gifImage.GetFrameCount(dimension);
for (var index = 0; index < frameCount; index++)
{
//find the frame
gifImage.SelectActiveFrame(dimension, index);
//return a copy of it
yield return (Bitmap) gifImage.Clone();
}
}
}
回答1:
Use the SelectActiveFrame method to select the active frame of an Image
instance holding an animated GIF. For example:
image.SelectActiveFrame(FrameDimension.Time, frameIndex);
To get the number of frames, call GetFrameCount(FrameDimension.Time)
If you just want to play the animation, you can put it into a PictureBox or use the ImageAnimator class.
回答2:
// Parses individual Bitmap frames from a multi-frame Bitmap into an array of Bitmaps
private Bitmap[] ParseFrames(Bitmap Animation)
{
// Get the number of animation frames to copy into a Bitmap array
int Length = Animation.GetFrameCount(FrameDimension.Time);
// Allocate a Bitmap array to hold individual frames from the animation
Bitmap[] Frames = new Bitmap[Length];
// Copy the animation Bitmap frames into the Bitmap array
for (int Index = 0; Index < Length; Index++)
{
// Set the current frame within the animation to be copied into the Bitmap array element
Animation.SelectActiveFrame(FrameDimension.Time, Index);
// Create a new Bitmap element within the Bitmap array in which to copy the next frame
Frames[Index] = new Bitmap(Animation.Size.Width, Animation.Size.Height);
// Copy the current animation frame into the new Bitmap array element
Graphics.FromImage(Frames[Index]).DrawImage(Animation, new Point(0, 0));
}
// Return the array of Bitmap frames
return Frames;
}
回答3:
Semi-related, in WPF you have the BitmapDecoders which will provide you with all the frames of an image.
See BitmapDecoder.Create and BitmapDecoder.Frames.
回答4:
Image img = Image.FromFile(@"D:\images\zebra.gif");
//retrieving 1st frame
img.SelectActiveFrame(new FrameDimension(img.FrameDimensionsList[0]), 1);
pictureBox1.Image = new Bitmap(img);
来源:https://stackoverflow.com/questions/1712708/how-to-split-an-animated-gif-in-net