• 从MediaElement中提取视频的图片


    如果想将视频中的某一帧内容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事件中才创建,那么,往往保存成的位图是黑的,这是因为视频还没有加载成功。

  • 相关阅读:
    MySQL没有备份情况下误删除表恢复
    CentOS 6下安装MySQL5.6
    关于mysql占用内存不释放的实验结论
    几种相似性度量(Similarity Measurement)
    几种平均数(Mean function)
    Ansible 多机文件分发、执行脚本并单机合并实验结果(Check point, 多线程异步执行,主机状态检测等)
    nginx-1.11.10 hello world module
    nginx-1.11.10 download, install, start and stop
    U-disk format
    test for cvx library in matlab
  • 原文地址:https://www.cnblogs.com/Memory/p/1659453.html
Copyright © 2020-2023  润新知