WPF中的视频——(3)

          如果想将视频中的某一帧内容snapshoot下来,存成图片或作为Image控件的内容显示,也不是没有办法的。

          直接上代码吧,首先,创建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"/>

ButtonClick响应函数里,

    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();

    }

我们使用RenderTargetBitmapRender方法,将Visual对象转化成位图,再使用XXXBitmapEncoder保存成图片文件,或者直接将RenderTargetBitmap赋给Image控件的内容进行显示。

 

如果我们不是使用的MediaElement控件,而是使用MediaPlayer,我们就要使用(2)中描述的办法,创建一个DrawingVisual对象,使用DrawingContextDrawVideo方法播放视频,再将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事件中才创建,那么,往往保存成的位图是黑的,这是因为视频还没有加载成功。

posted on 2009-03-13 13:37  xirihanlin  阅读(1961)  评论(0编辑  收藏  举报