Silverlight 3.0 中的 WriteableBitmap

2018-01-16 10:39:19 浏览数 (1)

Silverlight 3.0 中的 WriteableBitmap

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

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

使用WriteableBitmap

代码语言:js复制
 <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>
代码语言:js复制
        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来呈现位图)

代码语言:js复制
        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

http://rhlopez.com/blog/post/2009/07/17/Silverlight-3-WriteableBitmap-to-Jpg.aspx

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

0 人点赞