Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地
2011-05-11 09:40
531 查看
在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能。
下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地。
一、在Silverlight运行界面中我们检查系统默认摄像头和麦克风是否可用如下图:
二、我们看Xaml代码如下所示:
四、下面我们看看实际的运行效果如何,以及保存下文档的图分别如下所示,如需源码请点击 SL4Video.zip 下载:
下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地。
一、在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 下载:
相关文章推荐
- Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地【附带实例源码】
- Silverlight实用窍门系列:36.Silverlight中播放视频和打印文档【附带源码实例】
- Silverlight实用窍门系列:50.InkPresenter涂鸦板的基本使用,以及将效果保存为Png图片【附带源码实例】
- Silverlight实用窍门系列:50.InkPresenter涂鸦板的基本使用,以及将效果保存为Png图片【附带源码实例】
- Silverlight实用窍门系列:75.Silverlight中DataGrid制作复杂表头
- Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】
- Silverlight实用窍门系列:51.Silverlight页面控件的放大缩小、Silverlight和Html控件的互相操作【附带源码实例】
- Silverlight实用窍门系列:53.Silverlight中的5种基本变换RotateTransform、ScaleTransform……
- Silverlight实用窍门系列:59.多个中心点联动多线的可拖动控件扩展为拓扑图
- Silverlight实用窍门系列:6.Silverlight弹出窗口以及DataGrid分页【附带实例源码】
- Silverlight实用窍门系列:74.Silverlight使用Perst数据库Demo
- Silverlight实用窍门系列:62.Silverlight中的Action动作TargetedTriggerAction、TriggerAction
- Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别
- Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)
- Silverlight实用窍门系列:51.Silverlight页面控件的放大缩小、Silverlight和Html控件的互相操作
- Silverlight实用窍门系列:20.后台CS代码中创建四种常用的动画效果【附带源码实例】
- Silverlight实用窍门系列:72.Silverlight的Implicit Style、自定义主题皮肤、系统主题皮肤
- Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】
- Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】
- Silverlight实用窍门系列:62.Silverlight中的Action动作TargetedTriggerAction、TriggerAction 推荐