Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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();
                }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 /// <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;
 }