直接上代码吧,首先,创建MediaElement控件,Source属性设置视频的路径,并通过Position属性进行一定的Seek。
<MediaElement Name="video" LoadedBehavior="Pause" Opacity="1" ScrubbingEnabled="True"
Source="C:"Users"Public"Videos"Sample Videos"bear.wmv" Position="0:0:5"/>
在Button的Click响应函数里,
private void Button_Click(object sender, RoutedEventArgs e)
{
FileStream stream = File.Open("bear.png", FileMode.Create);
RenderTargetBitmap bmp = new RenderTargetBitmap((int)this.video.ActualWidth,
(int)this.video.ActualHeight, 96, 96, PixelFormats.Pbgra32);
bmp.Render(this.video);
PngBitmapEncoder coder = new PngBitmapEncoder();
coder.Interlace = PngInterlaceOption.Off;
coder.Frames.Add(BitmapFrame.Create(bmp));
coder.Save(stream);
stream.Close();
}
我们使用RenderTargetBitmap的Render方法,将Visual对象转化成位图,再使用XXXBitmapEncoder保存成图片文件,或者直接将RenderTargetBitmap赋给Image控件的内容进行显示。
如果我们不是使用的MediaElement控件,而是使用MediaPlayer,我们就要使用(2)中描述的办法,创建一个DrawingVisual对象,使用DrawingContext的DrawVideo方法播放视频,再将DrawingVisual对象转化为位图。
大概的代码如下:
void Window1_Loaded(object sender, RoutedEventArgs e)
{
_visual = new DrawingVisual();
DrawingContext dc = _visual.RenderOpen();
MediaPlayer player = new MediaPlayer();
player.Open(new Uri(@"C:"Users"Public"Videos"Sample Videos"bear.wmv"));
player.Position = TimeSpan.FromSeconds(5);
player.ScrubbingEnabled = true;
player.Pause();
dc.DrawVideo(player, new Rect(0, 0, _desireSize.Width, _desireSize.Height));
dc.Close();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
FileStream stream = File.Open("bear.png", FileMode.Create);
RenderTargetBitmap bmp = new RenderTargetBitmap((int)_desireSize.Width,
(int)_desireSize.Height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(_visual);
PngBitmapEncoder coder = new PngBitmapEncoder();
coder.Interlace = PngInterlaceOption.Off;
coder.Frames.Add(BitmapFrame.Create(bmp));
coder.Save(stream);
stream.Close();
}
DrawingVisual _visual = null;
Size _desireSize = new Size(400, 300);
DrawingVisual 对象之所以在Loaded事件中创建,是因为要提前加载视频。如果在Click事件中才创建,那么,往往保存成的位图是黑的,这是因为视频还没有加载成功。