public void CloneIsDeep() { var meta = new GifMetaData() { RepeatCount = 1, ColorTableMode = GifColorTableMode.Global, GlobalColorTableLength = 2 }; var clone = (GifMetaData)meta.DeepClone(); clone.RepeatCount = 2; clone.ColorTableMode = GifColorTableMode.Local; clone.GlobalColorTableLength = 1; Assert.False(meta.RepeatCount.Equals(clone.RepeatCount)); Assert.False(meta.ColorTableMode.Equals(clone.ColorTableMode)); Assert.False(meta.GlobalColorTableLength.Equals(clone.GlobalColorTableLength)); }
public void NonMutatingEncodePreservesPaletteCount() { using (var inStream = new MemoryStream(TestFile.Create(TestImages.Gif.Leo).Bytes)) using (var outStream = new MemoryStream()) { inStream.Position = 0; var image = Image.Load(inStream); GifMetaData metaData = image.MetaData.GetFormatMetaData(GifFormat.Instance); GifFrameMetaData frameMetaData = image.Frames.RootFrame.MetaData.GetFormatMetaData(GifFormat.Instance); GifColorTableMode colorMode = metaData.ColorTableMode; var encoder = new GifEncoder() { ColorTableMode = colorMode, Quantizer = new OctreeQuantizer(frameMetaData.ColorTableLength) }; image.Save(outStream, encoder); outStream.Position = 0; outStream.Position = 0; var clone = Image.Load(outStream); GifMetaData cloneMetaData = clone.MetaData.GetFormatMetaData <GifMetaData>(GifFormat.Instance); Assert.Equal(metaData.ColorTableMode, cloneMetaData.ColorTableMode); // Gifiddle and Cyotek GifInfo say this image has 64 colors. Assert.Equal(64, frameMetaData.ColorTableLength); for (int i = 0; i < image.Frames.Count; i++) { GifFrameMetaData ifm = image.Frames[i].MetaData.GetFormatMetaData(GifFormat.Instance); GifFrameMetaData cifm = clone.Frames[i].MetaData.GetFormatMetaData(GifFormat.Instance); Assert.Equal(ifm.ColorTableLength, cifm.ColorTableLength); Assert.Equal(ifm.FrameDelay, cifm.FrameDelay); } image.Dispose(); clone.Dispose(); } }
public static ObjectAnimationUsingKeyFrames CreateFrames(GifBitmapDecoder decoder) { if (decoder == null) { return(null); } ObjectAnimationUsingKeyFrames animation = new ObjectAnimationUsingKeyFrames(); // Read MetaData from GIF // this give us the Width and Height of the GIF GifMetaData gifData = GifMetaDataReader.GetGifMetaData(decoder); if (gifData == null) { return(null); } TimeSpan animationTime = TimeSpan.FromMilliseconds(0); BitmapSource baseFrame = null; // create a animation for every frame in GIF foreach (BitmapFrame curFrame in decoder.Frames) { // first we need to read the metadata from the frame // to know the position, width, height, delay and disposalmethod GifFrameMetaData frameMetaData = GifMetaDataReader.GetGifFrameMetaData(curFrame); if (frameMetaData != null) { // Create a "image" from the current frame BitmapSource CurCreatedFrame = GifImageFrameCreator.CreateFrame( new System.Drawing.Size(gifData.Width, gifData.Height), curFrame, frameMetaData, baseFrame); // add the frame to the animaton animation.KeyFrames.Add(new DiscreteObjectKeyFrame() { KeyTime = animationTime, Value = CurCreatedFrame }); // Check the disposal method switch (frameMetaData.DisposalMethod) { case GifFrameDisposalMethod.None: break; case GifFrameDisposalMethod.DoNotDispose: baseFrame = CurCreatedFrame; break; case GifFrameDisposalMethod.RestoreBackground: baseFrame = GifImageFrameCreator.RestoreBackground(new System.Drawing.Size(gifData.Width, gifData.Height), curFrame, frameMetaData); break; case GifFrameDisposalMethod.RestorePrevious: break; default: break; } // increse the timeline with the delay of the frame animationTime += frameMetaData.Delay; } } animation.Duration = animationTime; return(animation); }
/// <summary> /// Initializes a new instance of the <see cref="GifMetaData"/> class. /// </summary> /// <param name="other">The metadata to create an instance from.</param> private GifMetaData(GifMetaData other) { this.RepeatCount = other.RepeatCount; this.ColorTableMode = other.ColorTableMode; this.GlobalColorTableLength = other.GlobalColorTableLength; }