private void WriteGraphicsControlExtension(GraphicsControlExtension extension) { var data = new byte[4]; data[0] = (byte)(extension.DisposalMethod << 2 | (extension.UserInputFlag ? 1 : 0) << 1 | (extension.TransparencyFlag ? 1 : 0)); data[1] = (byte)(extension.DelayTime & 0xFF); data[2] = (byte)((extension.DelayTime & 0xFF00) >> 8); data[3] = (byte)extension.TransparencyIndex; this.WriteExtension(0xF9, data); }
private void createImage(uint[] colorIndexes, ImageDescriptor imageDescriptor, ColorTable localColorTable) { uint localX = imageDescriptor.X; uint localY = imageDescriptor.Y; uint localW = imageDescriptor.Width; uint localH = imageDescriptor.Height; //Every pixel consists of 4 bytes: R, G, B, A values byte[] data = new byte[localW * localH * 4]; int transparentColorIndex = -1; int delay = 0; FrameDisposalMethod disposalMethod = FrameDisposalMethod.Clear; if (_extensions.Count > 0 && _extensions.Last() is GraphicsControlExtension) { GraphicsControlExtension gce = _extensions.Last() as GraphicsControlExtension; delay = gce.Delay; if (gce.HasTransparency) { transparentColorIndex = gce.TransparentColorIndex; } disposalMethod = gce.DisposalMethod; } for (int i = 0; i < data.Length; i += 4) { Color color = localColorTable[(int)colorIndexes[i / 4]]; data[i + 0] = color.R; data[i + 1] = color.G; data[i + 2] = color.B; if (colorIndexes[i / 4] == transparentColorIndex) { data[i + 3] = 0; } else { data[i + 3] = byte.MaxValue; } } if (imageDescriptor.Interlaced) { data = interlace(data, localW, localH); } _images.Add(new GifImage(data, localX, localY, localW, localH, delay, disposalMethod)); }