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; } }
public override void Dispose() { if (_nativeImageProvider != null) { _nativeImageProvider.Dispose(); _nativeImageProvider = null; return; } _frames.Clear(); _renderedFrames.Clear(); }