Beispiel #1
0
        private static ImageBehavior.FrameMetadata GetFrameMetadata(GifFrame gifMetadata)
        {
            GifImageDescriptor descriptor = gifMetadata.Descriptor;

            ImageBehavior.FrameMetadata frameMetadata = new ImageBehavior.FrameMetadata()
            {
                Left           = descriptor.Left,
                Top            = descriptor.Top,
                Width          = descriptor.Width,
                Height         = descriptor.Height,
                Delay          = TimeSpan.FromMilliseconds(100.0),
                DisposalMethod = ImageBehavior.FrameDisposalMethod.None
            };
            GifGraphicControlExtension controlExtension = gifMetadata.Extensions.OfType <GifGraphicControlExtension>().FirstOrDefault <GifGraphicControlExtension>();

            if (controlExtension != null)
            {
                if (controlExtension.Delay != 0)
                {
                    frameMetadata.Delay = TimeSpan.FromMilliseconds((double)controlExtension.Delay);
                }
                frameMetadata.DisposalMethod = (ImageBehavior.FrameDisposalMethod)controlExtension.DisposalMethod;
            }
            return(frameMetadata);
        }
Beispiel #2
0
        private static BitmapSource MakeFrame(
            ImageBehavior.Int32Size fullSize,
            BitmapSource rawFrame,
            ImageBehavior.FrameMetadata metadata,
            BitmapSource baseFrame)
        {
            if (baseFrame == null && ImageBehavior.IsFullFrame(metadata, fullSize))
            {
                return(rawFrame);
            }
            DrawingVisual drawingVisual = new DrawingVisual();

            using (DrawingContext drawingContext = drawingVisual.RenderOpen())
            {
                if (baseFrame != null)
                {
                    Rect rectangle = new Rect(0.0, 0.0, (double)fullSize.Width, (double)fullSize.Height);
                    drawingContext.DrawImage((ImageSource)baseFrame, rectangle);
                }
                Rect rectangle1 = new Rect((double)metadata.Left, (double)metadata.Top, (double)metadata.Width, (double)metadata.Height);
                drawingContext.DrawImage((ImageSource)rawFrame, rectangle1);
            }
            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(fullSize.Width, fullSize.Height, 96.0, 96.0, PixelFormats.Pbgra32);

            renderTargetBitmap.Render((Visual)drawingVisual);
            if (renderTargetBitmap.CanFreeze && !renderTargetBitmap.IsFrozen)
            {
                renderTargetBitmap.Freeze();
            }
            return((BitmapSource)renderTargetBitmap);
        }
Beispiel #3
0
        private static ObjectAnimationUsingKeyFrames GetAnimation(
            Image imageControl,
            BitmapSource source)
        {
            ObjectAnimationUsingKeyFrames animation1 = AnimationCache.GetAnimation((ImageSource)source, ImageBehavior.GetRepeatBehavior(imageControl));

            if (animation1 != null)
            {
                return(animation1);
            }
            GifFile gifFile;

            if (!(ImageBehavior.GetDecoder(source, out gifFile) is GifBitmapDecoder decoder) || decoder.Frames.Count <= 1)
            {
                return((ObjectAnimationUsingKeyFrames)null);
            }
            ImageBehavior.Int32Size fullSize = ImageBehavior.GetFullSize((BitmapDecoder)decoder, gifFile);
            int frameIndex = 0;
            ObjectAnimationUsingKeyFrames animation2 = new ObjectAnimationUsingKeyFrames();
            TimeSpan     zero      = TimeSpan.Zero;
            BitmapSource baseFrame = (BitmapSource)null;

            foreach (BitmapFrame frame1 in decoder.Frames)
            {
                ImageBehavior.FrameMetadata frameMetadata     = ImageBehavior.GetFrameMetadata((BitmapDecoder)decoder, gifFile, frameIndex);
                BitmapSource           frame2                 = ImageBehavior.MakeFrame(fullSize, (BitmapSource)frame1, frameMetadata, baseFrame);
                DiscreteObjectKeyFrame discreteObjectKeyFrame = new DiscreteObjectKeyFrame((object)frame2, (KeyTime)zero);
                animation2.KeyFrames.Add((ObjectKeyFrame)discreteObjectKeyFrame);
                zero += frameMetadata.Delay;
                switch (frameMetadata.DisposalMethod)
                {
                case ImageBehavior.FrameDisposalMethod.None:
                case ImageBehavior.FrameDisposalMethod.DoNotDispose:
                    baseFrame = frame2;
                    break;

                case ImageBehavior.FrameDisposalMethod.RestoreBackground:
                    baseFrame = !ImageBehavior.IsFullFrame(frameMetadata, fullSize) ? ImageBehavior.ClearArea(frame2, frameMetadata) : (BitmapSource)null;
                    break;
                }
                ++frameIndex;
            }
            animation2.Duration       = (Duration)zero;
            animation2.RepeatBehavior = ImageBehavior.GetActualRepeatBehavior(imageControl, (BitmapDecoder)decoder, gifFile);
            AnimationCache.AddAnimation((ImageSource)source, ImageBehavior.GetRepeatBehavior(imageControl), animation2);
            AnimationCache.IncrementReferenceCount((ImageSource)source, ImageBehavior.GetRepeatBehavior(imageControl));
            return(animation2);
        }
Beispiel #4
0
        private static BitmapSource ClearArea(
            BitmapSource frame,
            ImageBehavior.FrameMetadata metadata)
        {
            DrawingVisual drawingVisual = new DrawingVisual();

            using (DrawingContext drawingContext = drawingVisual.RenderOpen())
            {
                Rect         rect1        = new Rect(0.0, 0.0, (double)frame.PixelWidth, (double)frame.PixelHeight);
                Rect         rect2        = new Rect((double)metadata.Left, (double)metadata.Top, (double)metadata.Width, (double)metadata.Height);
                PathGeometry pathGeometry = Geometry.Combine((Geometry) new RectangleGeometry(rect1), (Geometry) new RectangleGeometry(rect2), GeometryCombineMode.Exclude, (Transform)null);
                drawingContext.PushClip((Geometry)pathGeometry);
                drawingContext.DrawImage((ImageSource)frame, rect1);
            }
            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(frame.PixelWidth, frame.PixelHeight, frame.DpiX, frame.DpiY, PixelFormats.Pbgra32);

            renderTargetBitmap.Render((Visual)drawingVisual);
            if (renderTargetBitmap.CanFreeze && !renderTargetBitmap.IsFrozen)
            {
                renderTargetBitmap.Freeze();
            }
            return((BitmapSource)renderTargetBitmap);
        }
Beispiel #5
0
 private static bool IsFullFrame(
     ImageBehavior.FrameMetadata metadata,
     ImageBehavior.Int32Size fullSize)
 {
     return(metadata.Left == 0 && metadata.Top == 0 && metadata.Width == fullSize.Width && metadata.Height == fullSize.Height);
 }