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();
}
}
}
Go to File > Export > Render Video…, then select a folder to save the images to be extracted, choose Photoshop Image Sequence, select an image format, BMP, JPEG, PNG or TIFF, then click on Render button and each frame should be exported to an image in the selected format saved to the folder you have selected above.
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.
// 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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With