• 从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事件中才创建,那么,往往保存成的位图是黑的,这是因为视频还没有加载成功。

  • 相关阅读:
    关于 HTML5 的 11 个让人难以接受的事实
    【转】zookeeper 的监控工具
    arm+linux 裸机环境搭建之安装工具篇(eclipse)
    Unity 利用NGUI2.6.3做技能冷却的CD效果
    spring boot打包文件后,报错No such file or directory
    机器学习实战读书笔记(3)朴素贝叶斯
    机器学习实战读书笔记(2)决策树
    机器学习实战读书笔记(1)
    No operations allowed after connection closed--转
    简单理解Socket
  • 原文地址:https://www.cnblogs.com/Memory/p/1659453.html
Copyright © 2020-2023  润新知