【问题标题】:How to split an animated gif in .net?如何在.net中分割动画gif?
【发布时间】:2009-11-11 02:54:33
【问题描述】:

如何在 .net 中将动画 gif 拆分为其组成部分?

具体来说,我想将它们加载到内存中的 Image(s) (System.Drawing.Image) 中。

=======================

根据 SLaks 的回答,我现在有了这个

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();
        }
    }
}

【问题讨论】:

    标签: .net image image-manipulation file-format gif


    【解决方案1】:

    使用SelectActiveFrame 方法来选择拥有动画GIF 的Image 实例的活动帧。例如:

    image.SelectActiveFrame(FrameDimension.Time, frameIndex);
    

    要获取帧数,​​请调用GetFrameCount(FrameDimension.Time)

    如果你只是想播放动画,你可以把它放到一个PictureBox中或者使用ImageAnimator类。

    【讨论】:

      【解决方案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;
      }
      

      【讨论】:

      • 这种技术(写在C##)比Clone() 方法有一个优势,因为Clone() 方法为每一帧复制整个动画,基本上是平方存储所有动画所需的内存量帧(例如Clone() 方法产生一个动画数组,其中每个副本都有不同的当前帧)。为了真正解析动画帧,每个动画帧都需要在数组中绘制到自己的Bitmap 中。根据需要,一旦将动画解析为帧数组,就可以将其处理为垃圾收集...
      【解决方案3】:

      半相关,在 WPF 中,您有 BitmapDecoders,它将为您提供图像的所有帧。

      请参阅 BitmapDecoder.CreateBitmapDecoder.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);
        

        【讨论】:

          猜你喜欢
          • 2010-11-14
          • 1970-01-01
          • 2014-12-24
          • 2013-05-02
          • 2010-09-22
          • 2011-03-08
          • 1970-01-01
          相关资源
          最近更新 更多