在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能。

下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地。

一、在Silverlight运行界面中我们检查系统默认摄像头和麦克风是否可用如下图:

二、我们看Xaml代码如下所示:

<Grid x:Name="LayoutRoot" Background="White">
<Border BorderBrush="Silver" BorderThickness="1" Height="346" HorizontalAlignment="Left"
Margin="21,19,0,0" Name="border1" VerticalAlignment="Top" Width="477" >
<Border.Background>
<VideoBrush x:Name="ShowVideo"></VideoBrush>
</Border.Background>
</Border>
<Button Content="打开摄像头" Height="32" HorizontalAlignment="Left"
Margin="38,380,0,0" Name="button1" VerticalAlignment="Top"
Width="95" Click="button1_Click" />
<Button Content="关闭摄像头" Height="32" HorizontalAlignment="Left"
Name="button2" Width="85" VerticalAlignment="Top"
Margin="268,380,0,0" Click="button2_Click" />
<Button Content="截 图" Height="32" Name="button3" Margin="153,380,0,0"
HorizontalAlignment="Left" Width="91" VerticalAlignment="Top"
Click="button3_Click" />
<StackPanel Height="346" HorizontalAlignment="Left" Margin="514,19,0,0"
Name="stackPanel1" VerticalAlignment="Top" Width="460" />
</Grid>

在这里我们建立一个Border显示视频图像,然后加三个按钮分别控制摄像头的打开、关闭、截图。最后加一个StackPanel来显示截图的影像。

三、下面请看CS代码如下所示,对于截图保存图片所用函数是在园子里的zhangxuguang2007兄弟那里找的。

public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
//提供音频和视频的方法
CaptureSource video = new CaptureSource();

private void button1_Click(object sender, RoutedEventArgs e)
{
//获取计算机上的默认视频对象
VideoCaptureDevice camera = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
//成功请求到计算机上的视频设备
if (CaptureDeviceConfiguration.RequestDeviceAccess())
{
//设置视频设备为Camera
video.VideoCaptureDevice = camera;
//VideoBrush设置源为video
ShowVideo.SetSource(video);
ShowVideo.Stretch = Stretch.Fill;
//开始捕捉视频
video.Start();
}
}

private void button3_Click(object sender, RoutedEventArgs e)
{
//截图
WriteableBitmap wBitmap = new WriteableBitmap(border1, new MatrixTransform());
Image img = new Image();
img.Width = 450;
img.Margin = new Thickness(2);
img.Source = wBitmap;
//保存图片
if (wBitmap != null)
{
SaveFileDialog saveDlg = new SaveFileDialog();
saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";
saveDlg.DefaultExt = ".jpeg";

if ((bool)saveDlg.ShowDialog())
{
using (Stream fs = saveDlg.OpenFile())
{
SaveToFile(wBitmap, fs);
MessageBox.Show("图片保存成功");
}
}
}
this.stackPanel1.Children.Clear();
this.stackPanel1.Children.Add(img);
}
/// <summary>
/// 保存图片,
/// </summary>
/// <param name="bitmap"></param>
/// <param name="fs"></param>
private static void SaveToFile(WriteableBitmap bitmap, Stream fs)
{
int width = bitmap.PixelWidth;
int height = bitmap.PixelHeight;
int bands = 3;
byte[][,] raster = new byte[bands][,];

for (int i = 0; i < bands; i++)
{
raster[i] = new byte[width, height];
}

for (int row = 0; row < height; row++)
{
for (int column = 0; column < width; column++)
{
int pixel = bitmap.Pixels[width * row + column];
raster[0][column, row] = (byte)(pixel >> 16);
raster[1][column, row] = (byte)(pixel >> 8);
raster[2][column, row] = (byte)pixel;
}

}

FluxJpeg.Core.ColorModel model = new FluxJpeg.Core.ColorModel
{ colorspace = FluxJpeg.Core.ColorSpace.RGB };
FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);

//Encode the Image as a JPEG
MemoryStream stream = new MemoryStream();
FluxJpeg.Core.Encoder.JpegEncoder encoder =
new FluxJpeg.Core.Encoder.JpegEncoder(img, 100, stream);
encoder.Encode();

//Back to the start
stream.Seek(0, SeekOrigin.Begin);

//Get teh Bytes and write them to the stream
byte[] binaryData = new Byte[stream.Length];
long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);
fs.Write(binaryData, 0, binaryData.Length);
}
private void button2_Click(object sender, RoutedEventArgs e)
{
//停止视频
video.Stop();
}
}

四、下面我们看看实际的运行效果如何,以及保存下文档的图分别如下所示,如需源码请点击 SL4Video.zip 下载:

转载于:https://www.cnblogs.com/chengxingliang/archive/2011/05/11/2042653.html

Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地【附带实例源码】...相关推荐

  1. Silverlight实用窍门系列:59.多个中心点联动多线的可拖动控件扩展为拓扑图

    在本系列的第17篇文章中"Silverlight实用窍门系列:17.中心点联动多线的可拖动控件(绘制工程图.拓扑图基础) ",制作了基本的中心联动图标.有园友对此图的扩展不是很清晰 ...

  2. Silverlight实用窍门系列:71.Silverlight的Style

    此文章实例基于Silverlight实用窍门系列:68.Silverlight的资源字典ResourceDictionary,如有数据源疑问请参考该文章. 在Silverlight中的Style相当于 ...

  3. Silverlight实用窍门大集合+Silverlight 5 最全新特性【目录索引】

    在最近的几个月内整理出了Silverlight的一些相关的比较实用的功能讲解文章,并且随着Silverlight 5 beta版本的发布整理出的新特性系列文章,在这里做一个总的概括和索引,以方便大家观 ...

  4. Silverlight实用窍门系列:56.Silverlight中的Binding使用(一)【附带实例源码】

    本文将详细讲述Silverlight中Binding,包括Binding的属性和用法,Binding的数据流向. Binding:一个完整的Binding过程是让源对象中的某个属性值通过一定流向规则进 ...

  5. Silverlight实用窍门系列:14.Visifire图表控件的使用一(图表的创建和基础使用)【附带源码实例】...

    在实际项目开展中,往往会牵扯到需要绘制图表的情况.而Visifire是一个比较美观大方的第三方图表控件,本文会讲述如何初步使用Visifire控件. 首先我们需要从Visifire的官方网站下载:ht ...

  6. Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】...

    在Silverlight程序(非Out of Browser模式)中是无法直接调用DLL的,但是很多的计算或者其他应用程序的调用中我们需要用到DLL的加载.比如调用DLL来识别身份证读卡器传输过来 ...

  7. Silverlight实用窍门系列:29.Silverlight碰撞测试、检测自定义控件碰撞,雷达扫描图之扫描雷达点状态【附带源码实例】...

    雷达扫描图中当雷达指针转动扫描到某一个点上的时候,判断这个点的CPU值是否已经超过60的警戒位置如果超过将此点设置为红色. 在Silverlight中我们的雷达指针是一直在做圆运动的,我们要随时检测雷 ...

  8. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地

    在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能. 下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地. 一.在Silv ...

  9. Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别...

    问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有 ...

最新文章

  1. “双轮驱动”突破瓶颈,智源研究院发布“自然语言处理”重大研究方向,携手京东打造联合实验室...
  2. 一个非常棒的jQuery 评分插件--好东西要分享
  3. 【githubgit】1、github中的watch、star、fork的作用
  4. ansible配置详解及基本示例
  5. grub shell 错误_grub命令_Linux grub 命令用法详解:多重引导程序grub的命令行shell工具...
  6. 深度学习之循环神经网络(5)RNN情感分类问题实战
  7. [css] 父元素下有子元素,子元素也有高度但父元素的高度为何为0呢?分析下可能出现的原因及解决方法
  8. JS 停留几秒后返回上一页
  9. Go 语言为什么能成功?
  10. Node.js+windows
  11. 关于读取配置文件的一个小笔记
  12. 智能优化算法应用:基于GWO优化的Renyi熵图像多阈值分割 - 附代码
  13. autocad型源代码_总结一下可以研究的CAD源代码
  14. 服务器系统更新后找不到硬盘,重装win10系统找不到硬盘完美解决方法
  15. RabbitMq 406错误
  16. 职称英语职称计算机如何折算为学时,发表论文算继续教育多少学时
  17. [Winows 软件推荐] 四款常用精品的软件
  18. 【卡特兰数】【高精】WZK打雪仗(war)
  19. 安全测试(三) 服务器安全 渗透测试 常规服务器安全漏洞 高危端口暴露、弱口令密码、暴力破解、服务器提权、Mysql数据库提权等 浅谈《社会工程学》实战案例
  20. 小米路由器进入linux系统,小米路由器操作系统竟不是miui

热门文章

  1. Java静态代理、动态代理与CGLib代理
  2. Java的Map接口,以及Collection和Collections的区别
  3. Java8新特性之函数式接口
  4. Altium Designer -- 差分布线和阻抗匹配
  5. 汇编语言LENGTHOF运算符:计算数组中元素的个数
  6. CURL NDK 交叉编译
  7. IPFS: BitSwap协议(数据块交换)
  8. 从Tensorflow代码中理解LSTM网络
  9. JZOJ 3660. 【SHTSC2014】信号增幅仪
  10. BZOJ 2049: [Sdoi2008]Cave 洞穴勘测