天道酬勤

博观而约取,厚积而薄发!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Silverlight 3.0 中的 WriteableBitmap

Posted on 2010-07-15 11:21  Happy Coding  阅读(287)  评论(0编辑  收藏  举报
尽管矢量图形非常的强大但是在有些情况下还是需要用到位图,因为他们在运行时能得到更高的执行效率和渲染效果。在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();
        }

扩展

WriteableBitmap转Jpg
WriteableBitmap转PNG

http://blogs.msdn.com/jstegman/archive/2008/04/21/dynamic-image-generation-in-silverlight.aspx


下载