2012-04-14 69 views
2

我有一個非常複雜的Storyboard當一個「活」窗口中運行它完美的作品,但我有麻煩手動動畫這個故事板來獲得一幀一幀的動畫,我可以保存到個人PNG文件。所有生成的圖像都是第一個動畫幀。保存視頻/故事板

我已經看到thisthis,this並最終是this。也有this MSDN sample,但他們都談論動畫單一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); 
       } 
      } 
+0

嗨嗨...我陷入了類似的問題。我爲一個立方體設計了一個沿Z軸平移的動畫。現在我想製作動畫的視頻,但它只是顯示單個圖像。有趣的是,相同的代碼可以使簡單動畫的視頻像橢圓在畫布上移動。我知道你發佈這個版本已經有2年多了,但如果你能分享一些示例代碼或指引我朝着正確的方向發展,這將會非常有幫助。 – zizouraj 2014-10-08 11:05:12

回答

0

下面是另一種您可能會覺得有用的方法。如果你已經用盡了所有動畫XAML Storyboard的選項,那麼你可以探索的另一個選擇是用代碼創建你的Storyboard,這裏有一個例子:Animation in codebehind for loop, using RenderTransform

這樣做的好處是, d可對程序控制臺進行全面程序化控制,以便逐個逐個執行關鍵幀,然後可在每個幀後保存圖像。

我在jQuery中做了一些概念上類似的事情。基本上我寫了一個線條繪製簽名應用程序,它保存了座標數據點。然後我可以將數據點重新加載到算法中並重現動畫。 http://kodekreachor.com/prototypes/

我知道這是一種非常不同的技術,但它是能夠從代碼中完全控制順序動畫的想法,應該是外帶的,並且有望成爲您的一些靈感。

1

@wpfwannabe:非常感謝您的見解。

我用您的代碼和它的工作,雖然與一小的修改,如下所示:

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

在上面的代碼行:Program.AnimPlots.canvs是快照的區域,在你的情況下,它是gridTargetTmspnTimeSpan類型的對象。

希望這可以幫助別人:)