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

简介:

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

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

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

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

 
  1. <Grid x:Name="LayoutRoot" Background="White"
  2. <Border BorderBrush="Silver" BorderThickness="1" Height="346" HorizontalAlignment="Left" 
  3. Margin="21,19,0,0" Name="border1" VerticalAlignment="Top" Width="477" > 
  4. <Border.Background> 
  5. <VideoBrush x:Name="ShowVideo"></VideoBrush> 
  6. </Border.Background> 
  7. </Border> 
  8. <Button Content="打开摄像头" Height="32" HorizontalAlignment="Left" 
  9. Margin="38,380,0,0" Name="button1" VerticalAlignment="Top" 
  10. Width="95" Click="button1_Click" /> 
  11. <Button Content="关闭摄像头" Height="32" HorizontalAlignment="Left" 
  12. Name="button2" Width="85" VerticalAlignment="Top" 
  13. Margin="268,380,0,0" Click="button2_Click" /> 
  14. <Button Content="截 图" Height="32" Name="button3" Margin="153,380,0,0" 
  15. HorizontalAlignment="Left" Width="91" VerticalAlignment="Top" 
  16. Click="button3_Click" /> 
  17. <StackPanel Height="346" HorizontalAlignment="Left" Margin="514,19,0,0" 
  18. Name="stackPanel1" VerticalAlignment="Top" Width="460" /> 
  19. </Grid> 
  20. 复制代码 
  21.  
  22.         在这里我们建立一个Border显示视频图像,然后加三个按钮分别控制摄像头的打开、关闭、截图。最后加一个StackPanel来显示截图的影像。 
  23.  
  24.         三、下面请看CS代码如下所示,对于截图保存图片所用函数是在园子里的zhangxuguang2007兄弟那里找的。 
  25. public partial class MainPage : UserControl 
  26. public MainPage() 
  27. InitializeComponent(); 
  28. //提供音频和视频的方法 
  29. CaptureSource video = new CaptureSource(); 
  30.  
  31. private void button1_Click(object sender, RoutedEventArgs e) 
  32. //获取计算机上的默认视频对象 
  33. VideoCaptureDevice camera = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice(); 
  34. //成功请求到计算机上的视频设备 
  35. if (CaptureDeviceConfiguration.RequestDeviceAccess()) 
  36. //设置视频设备为Camera 
  37. video.VideoCaptureDevice = camera; 
  38. //VideoBrush设置源为video 
  39. ShowVideo.SetSource(video); 
  40. ShowVideo.Stretch = Stretch.Fill; 
  41. //开始捕捉视频 
  42. video.Start(); 
  43.  
  44. private void button3_Click(object sender, RoutedEventArgs e) 
  45. //截图 
  46. WriteableBitmap wBitmap = new WriteableBitmap(border1, new MatrixTransform()); 
  47. Image img = new Image(); 
  48. img.Width = 450; 
  49. img.Margin = new Thickness(2); 
  50. img.Source = wBitmap; 
  51. //保存图片 
  52. if (wBitmap != null
  53. SaveFileDialog saveDlg = new SaveFileDialog(); 
  54. saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg"
  55. saveDlg.DefaultExt = ".jpeg"
  56.  
  57. if ((bool)saveDlg.ShowDialog()) 
  58. using (Stream fs = saveDlg.OpenFile()) 
  59. SaveToFile(wBitmap, fs); 
  60. MessageBox.Show("图片保存成功"); 
  61. this.stackPanel1.Children.Clear(); 
  62. this.stackPanel1.Children.Add(img); 
  63. /// <summary> 
  64. /// 保存图片, 
  65. /// </summary> 
  66. /// <param name="bitmap"></param> 
  67. /// <param name="fs"></param> 
  68. private static void SaveToFile(WriteableBitmap bitmap, Stream fs) 
  69. int width = bitmap.PixelWidth; 
  70. int height = bitmap.PixelHeight; 
  71. int bands = 3; 
  72. byte[][,] raster = new byte[bands][,]; 
  73.  
  74. for (int i = 0; i < bands; i++) 
  75. raster[i] = new byte[width, height]; 
  76.  
  77. for (int row = 0; row < height; row++) 
  78. for (int column = 0; column < width; column++) 
  79. int pixel = bitmap.Pixels[width * row + column]; 
  80. raster[0][column, row] = (byte)(pixel >> 16); 
  81. raster[1][column, row] = (byte)(pixel >> 8); 
  82. raster[2][column, row] = (byte)pixel; 
  83.  
  84.  
  85. FluxJpeg.Core.ColorModel model = new FluxJpeg.Core.ColorModel 
  86. { colorspace = FluxJpeg.Core.ColorSpace.RGB }; 
  87. FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster); 
  88.  
  89. //Encode the Image as a JPEG 
  90. MemoryStream stream = new MemoryStream(); 
  91. FluxJpeg.Core.Encoder.JpegEncoder encoder = 
  92. new FluxJpeg.Core.Encoder.JpegEncoder(img, 100, stream); 
  93. encoder.Encode(); 
  94.  
  95. //Back to the start 
  96. stream.Seek(0, SeekOrigin.Begin); 
  97.  
  98. //Get teh Bytes and write them to the stream 
  99. byte[] binaryData = new Byte[stream.Length]; 
  100. long bytesRead = stream.Read(binaryData, 0, (int)stream.Length); 
  101. fs.Write(binaryData, 0, binaryData.Length); 
  102. private void button2_Click(object sender, RoutedEventArgs e) 
  103. //停止视频 
  104. video.Stop(); 

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

 



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/826439


相关文章

热门文章

最新文章