Exemple #1
0
        public APngAnimationProvider(string path, NConvert meta) : base(path, meta)
        {
            if (!IsAnimatedPng(path))
            {
                _nativeImageProvider = new NativeImageProvider(path, meta);
                Animator             = _nativeImageProvider.Animator;
                return;
            }

            var decoder = new APNGBitmap(path);

            _baseFrame      = decoder.DefaultImage;
            _frames         = new List <FrameInfo>(decoder.Frames.Length);
            _renderedFrames = new List <BitmapSource>(decoder.Frames.Length);
            Enumerable.Repeat(0, decoder.Frames.Length).ForEach(_ => _renderedFrames.Add(null));

            Animator = new Int32AnimationUsingKeyFrames {
                RepeatBehavior = RepeatBehavior.Forever
            };

            var wallclock = TimeSpan.Zero;

            for (var i = 0; i < decoder.Frames.Length; i++)
            {
                var frame = decoder.Frames[i];

                _frames.Add(new FrameInfo(decoder.IHDRChunk, frame));

                Animator.KeyFrames.Add(new DiscreteInt32KeyFrame(i, KeyTime.FromTimeSpan(wallclock)));
                wallclock += _frames[i].Delay;
            }
        }
Exemple #2
0
        public override void Dispose()
        {
            if (_nativeImageProvider != null)
            {
                _nativeImageProvider.Dispose();
                _nativeImageProvider = null;
                return;
            }

            _frames.Clear();
            _renderedFrames.Clear();
        }