从WPF动画/故事板中保存视频

3

我有一个非常复杂的Storyboard,在运行“live”窗口时可以完美地工作,但我有问题手动动画此故事板以获取一帧一帧的动画,我可以将其保存为单个PNG文件。生成的所有图像都是第一帧动画。

我已经看过这个这个这个,最终是这个。还有这个MSDN示例,但它们都只谈到了对单个DependencyProperty进行动画处理。我需要的是能够逐帧浏览具有复杂Storyboard的能力,而不仅仅是一个DP。

我已经到处搜索,但没有任何运气。同时我的实验也全部失败了。任何帮助都将不胜感激。这是一小段无效代码。

            storyboard.Begin(grid, true);
            //storyboard.Pause();
            //var clock = storyboard.CreateClock();
            //clock.Controller.Pause();
            var secs = Enumerable.Range(0, totalFrames).Select(t => (((double)t) / FPS));

            grid.Measure(new Size(480, 340));
            grid.Arrange(new Rect(grid.DesiredSize));

            foreach (var sec in secs)
            {
                //clock.Controller.SeekAlignedToLastTick(TimeSpan.FromSeconds(sec), TimeSeekOrigin.BeginTime);
                storyboard.SeekAlignedToLastTick(TimeSpan.FromSeconds(sec), TimeSeekOrigin.BeginTime);
                grid.InvalidateVisual();
                grid.UpdateLayout();

                var filename = Path.Combine(tempFolder, string.Format("image{0}.png", sec));
                var rtb = new RenderTargetBitmap((int) grid.ActualWidth, (int) grid.ActualHeight, 96, 96, PixelFormats.Pbgra32);
                rtb.Render(grid);

                var png = new PngBitmapEncoder();
                png.Frames.Add(BitmapFrame.Create(rtb));

                using (var stream = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite))
                {
                    png.Save(stream);
                }
            } 

嗨,你好...我遇到了类似的问题。我将一个立方体动画化以沿着Z轴移动。现在我想制作动画视频,但它只显示单个图像。有趣的是,相同的代码可以制作简单动画(如椭圆在画布上移动)的视频。我知道你发帖已经超过2年了,但如果你能分享一些示例代码或指点我正确的方向,那将非常有帮助。 - zizouraj
2个回答

2

@wpfwannabe:非常感谢你的见解。

我使用了你的代码,虽然进行了小修改如下:

rootStoryBoard.SeekAlignedToLastTick(Program.AnimPlots.canvs, TargetTmspn, System.Windows.Media.Animation.TimeSeekOrigin.BeginTime);

在上述代码行中:Program.AnimPlots.canvs 是快照区域,在您的情况下是 grid,而 TargetTmspn 是类型为 TimeSpan 的对象。

希望这能对某些人有所帮助 :)


0

这里有另一种方法,你可能会觉得有用。如果你已经尝试了所有逐帧动画XAML Storyboard的选项,那么你可以尝试在代码中创建你的Storyboard,这是一个例子:使用RenderTransform在代码后台进行循环动画

这样做的好处是,你可以完全通过编程控制你的Storyboard,逐个步进地浏览每个关键帧,然后在每个帧之后保存图像。

我以前在jQuery中做过类似的事情。基本上,我写了一个线条绘制签名应用程序,保存坐标数据点。然后,我可以重新加载数据点到算法中,并重新生成动画。http://kodekreachor.com/prototypes/

我知道这是一种非常不同的技术,但重要的是能够完全通过代码控制顺序动画,这应该是你可以学到的东西,希望能给你一些灵感。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接