mediaelement如何截图

54Gg 2011-12-22 03:16:19
如题,还有就是RenderTargetBitmap和PngBitmapEncoder这两个类引用不到,请各位大哥大姐们帮帮忙
...全文
462 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
herohua0509 2012-01-09
  • 打赏
  • 举报
回复
可以给你个思路,比较简单的实现方式

VisualBrush vb = new VisualBrush(mediaElement);

然后把这个vb转换一下给Image

然后用Image的Croppend方法,(名字可能不全)
设置X,Y,WINDTH,HEIGHT,就可以截取到了
海涵德 2012-01-03
  • 打赏
  • 举报
回复
给你个参考,看看能不能解决问题。
private void m()
{
Line l = new Line();

l.X1 = 1;
l.X2 = 200;
l.Y1 = 10;
l.Y2 = 100;

l.Stroke = new SolidColorBrush(Colors.Blue);

Canvas.SetLeft(l, 0);
Canvas.SetTop(l, 0);
canvas_1.Children.Add(l);

WriteableBitmap w = new WriteableBitmap(canvas_1, null);

Image img = new Image();
img.Source = w;
image_2.Source = w;
}
54Gg 2011-12-26
  • 打赏
  • 举报
回复
现在截出来的图是黑的,该咋整呢?
jv9 2011-12-23
  • 打赏
  • 举报
回复
使用WriteableBitmap 也可以实现你的需求。

例如截取流媒体第一帧:

private void ME_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
WriteableBitmap bitmap = new WriteableBitmap(ME, new TranslateTransform());
Image img = new Image();
img.Width = 140;
img.Margin = new Thickness(5);
img.Source = bitmap;
this.ThumbnailsPanel.Children.Add(img);
}
  • 打赏
  • 举报
回复
重新添加个PresentationCore.dll试试
54Gg 2011-12-22
  • 打赏
  • 举报
回复
这个我早就找到了,但是RenderTargetBitmap和PngBitmapEncoder这两个类根本就引用不到
  • 打赏
  • 举报
回复
帮你找到,试试看

RenderTargetBitmap和PngBitmapEncoder出自:
命名空间: System.Windows.Media.Imaging
程序集: PresentationCore(在 PresentationCore.dll 中)


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

8,738

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧