2009-10-18 20:58 by nasa,508 visits,网摘,收藏,编辑
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" 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 >
< Image x:Name ="optimage" Margin ="271,8,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);
}
{
// 创建一个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 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
下载
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。