Extended gif library

I am looking for a .NET C # gif animation library (not necessarily being free) that will allow me to take a gif file and attach a jpeg frame or another gif file to it. I will also have to be able to add a variable delay between frames. The answer to such questions here usually refers to the base library, which allows you to add a fixed delay between static images.

+6
source share
1 answer

I finished modifying http://www.codeproject.com/KB/GDI-plus/NGif.aspx to get what I need and it worked! :)

To process the source gif file, I added this method:

private bool AddGifFrames(Image image) { // implementation var fd = new FrameDimension(image.FrameDimensionsList[0]); int frameCount = image.GetFrameCount(fd); var frames = new List<Tuple<int, Image>>(); if (frameCount > 1) { frames = new List<Tuple<int, Image>>(); //0x5100 is the property id of the GIF frame 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<int, Image>(length, new Bitmap(image))); } } // Not animated foreach (var frame in frames) { HandleFrame(frame.Item2, frame.Item1); } return true; } 

and for custom delays I changed this method:

  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 } 

to summarize - this code can add gif as a frame, splitting it into frames and adding them, as well as add custom delays.

+7
source

Source: https://habr.com/ru/post/902220/


All Articles