3

我有一个非常复杂的Storyboard东西,在“实时”窗口上运行时效果很好,但是我无法手动为这个故事板设置动画以获取可以保存到单个 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);
                }
            } 
4

2 回答 2

2

@wpfwannabe:非常感谢您的洞察力。

我使用了你的代码,它成功了,尽管做了一些小的修改,如下所示:

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

在上面的代码行中:Program.AnimPlots.canvs是快照区域,在您的情况下,它是grid并且TargetTmspn是类型的对象TimeSpan

希望这可以帮助某人:)

于 2015-07-07T05:30:44.910 回答
0

这是您可能会发现有用的另一种方法。如果您已经用尽了所有选项来为您的 XAML 故事板逐帧设置动画,那么您可以探索的另一个选项是在代码中创建您的故事板,下面是一个示例:使用 RenderTransform 在代码隐藏 for 循环中的动画

这样做的好处是,您可以对 Storyboard 进行完全的编程控制,以逐个浏览各个关键帧,然后您可以在每一帧之后保存图像。

不久前,我在 jQuery 中做了一些概念上类似的事情。基本上我写了一个保存坐标数据点的画线签名应用程序。然后我可以将数据点重新加载回算法并重现动画。http://kodekreachor.com/prototypes/

我知道这是一种非常不同的技术,但它的想法是能够从代码中完全控制顺序动画,这应该是要点,希望能给你一些启发。

于 2012-04-14T16:39:57.490 回答