Silverlight 3.0 中的 WriteableBitmap

Silverlight 3.0 中的 WriteableBitmap

尽管矢量图形非常的强大但是在有些情况下还是需要用到位图,因为他们在运行时能得到更高的执行效率和渲染效果。在Silverlight 2.0中获得位图的唯一途径就是从服务器下载并将其嵌入到一个Image元素上。

在Silverlight 3.0中添加了一个新的图形类,WriteableBitmap。他可以动态的呈现位图,再结合上矢量图形一起运用,对于拍摄视频播放快照、生成算法内容(如分形图像)和数据可视化(如音乐可视化应用程序)很有用。也可以多次呈现位图,要使用Render方法,若是使用Render需要调用Invalidate来呈现位图。

使用WriteableBitmap
  <Grid x:Name="LayoutRoot">
      
<Image x:Name="optImage" Margin="271,8,0,0" VerticalAlignment="Top" Width="240" Stretch="None" Height="143" HorizontalAlignment="Left"/>
      
<StackPanel HorizontalAlignment="Left" Width="267" Orientation="Vertical" d:LayoutOverrides="Height">
          
<MediaElement x:Name="myMediaElement" Source="ice.mp4" Stretch="None" Height="132" Margin="0" CurrentStateChanged="myMediaElement_CurrentStateChanged"/>
          
<StackPanel Margin="0" Orientation="Vertical" d:LayoutOverrides="Width">
              
<Button x:Name="Screenshot" Content="Screenshot" Click="Screenshot_Click"/>
              
<ScrollViewer x:Name="ScreenshotViewer" Height="325" Margin="0">
                  
<StackPanel x:Name="thumbs"/>
              
</ScrollViewer>
          
</StackPanel>
      
</StackPanel>
  
</Grid>

        private void Screenshot_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            
// 创建一个WriteableBitmap并且把需要呈现位图的元素赋值给WriteableBitmap
            WriteableBitmap wb = new WriteableBitmap(myMediaElement, null);

            
// 创建一个Image元素来承载位图
            Image image = new Image();
            image.Height 
= 64;
            image.Margin 
= new Thickness(5);
            image.Source 
= wb;

            
// 将Image元素放入容器控件中
            thumbs.Children.Add(image);

            ScreenshotViewer.ScrollToVerticalOffset(ScreenshotViewer.ExtentHeight);

        }

 

多次呈现
这里使用一个Timer来多次呈现位图(要使用Render方法需要调用Invalidate来呈现位图
        DispatcherTimer timer;
        WriteableBitmap wbopt;
        
public MainPage()
        {
            InitializeComponent();

            timer 
= new DispatcherTimer();
            timer.Interval 
= TimeSpan.FromMilliseconds(10);
            timer.Tick 
+= new EventHandler(Render_Video);
            wbopt 
= new WriteableBitmap(240,143);
            optImage.Source 
= wbopt;

            timer.Start();
        }

        
void Render_Video(object sender, EventArgs e)
        {
            wbopt.Render(myMediaElement, 
null);
            wbopt.Invalidate();
        }

扩展
下载
posted @ 2009-10-18 20:58  王喆(nasa)  阅读(3568)  评论(6编辑  收藏  举报