高级gif库

我正在寻找一个.NET C#gif动画库(不一定是免费的),这将允许我获取一个gif文件并附加一帧jpeg甚至另一个gif文件。 我还需要能够在帧之间添加更改延迟。 这里类似问题的答案通常是指一个基本库,它只允许您在静态图像之间添加固定延迟。

我最后修改了http://www.codeproject.com/KB/GDI-plus/NGif.aspx代码以获得我需要的东西并且它有效! 🙂

对于gif源文件处理我添加了这个方法:

private bool AddGifFrames(Image image) { // implementation var fd = new FrameDimension(image.FrameDimensionsList[0]); int frameCount = image.GetFrameCount(fd); var frames = new List>(); if (frameCount > 1) { frames = new List>(); //0x5100 is the property id of the GIF frame's durations //this property does not exist when frameCount <= 1 byte[] times = image.GetPropertyItem(0x5100).Value; for (int i = 0; i < frameCount; i++) { //selects GIF frame based on FrameDimension and frameIndex image.SelectActiveFrame(fd, i); //length in milliseconds of display duration int length = BitConverter.ToInt32(times, 4 * i); //save currect image frame as new bitmap frames.Add(new Tuple(length, new Bitmap(image))); } } // Not animated foreach (var frame in frames) { HandleFrame(frame.Item2, frame.Item1); } return true; } 

至于自定义延迟,我修改了这个方法:

  protected void WriteGraphicCtrlExt(int? delay) { Fs.WriteByte(0x21); // extension introducer Fs.WriteByte(0xf9); // GCE label Fs.WriteByte(4); // data block size int transp, disp; if (Transparent == Color.Empty) { transp = 0; disp = 0; // dispose = no action } else { transp = 1; disp = 2; // force clear if using transparent color } if (Dispose >= 0) { disp = Dispose & 7; // user override } disp <<= 2; // packed fields Fs.WriteByte(Convert.ToByte(0 | // 1:3 reserved disp | // 4:6 disposal 0 | // 7 user input - 0 = none transp)); // 8 transparency flag WriteShort(delay ?? Delay); // delay x 1/100 sec Fs.WriteByte(Convert.ToByte(TransIndex)); // transparent color index Fs.WriteByte(0); // block terminator } 

总结一下 - 这段代码可以通过将gif分割为帧并添加它们来添加gif作为帧,并且还可以添加自定义延迟。