天天看點

Silverlight實用竅門系列:40.Silverlight中捕捉視訊,截圖儲存到本地

     在Silverlight中我們可以捕捉視訊裝置以制作視訊會議系統,或者通過視訊裝置截圖功能上傳頭像等功能。

         下面我們通過一個簡單的執行個體來通路視訊裝置,并且截取圖像下載下傳該截圖檔案至本地。

         一、在Silverlight運作界面中我們檢查系統預設攝像頭和麥克風是否可用如下圖:

<a href="http://blog.51cto.com/attachment/201204/221655501.jpg" target="_blank"></a>

         二、我們看Xaml代碼如下所示:

&lt;Grid x:Name="LayoutRoot" Background="White"&gt; 

&lt;Border BorderBrush="Silver" BorderThickness="1" Height="346" HorizontalAlignment="Left" 

Margin="21,19,0,0" Name="border1" VerticalAlignment="Top" Width="477" &gt; 

&lt;Border.Background&gt; 

&lt;VideoBrush x:Name="ShowVideo"&gt;&lt;/VideoBrush&gt; 

&lt;/Border.Background&gt; 

&lt;/Border&gt; 

&lt;Button Content="打開攝像頭" Height="32" HorizontalAlignment="Left" 

Margin="38,380,0,0" Name="button1" VerticalAlignment="Top" 

Width="95" Click="button1_Click" /&gt; 

&lt;Button Content="關閉攝像頭" Height="32" HorizontalAlignment="Left" 

Name="button2" Width="85" VerticalAlignment="Top" 

Margin="268,380,0,0" Click="button2_Click" /&gt; 

&lt;Button Content="截 圖" Height="32" Name="button3" Margin="153,380,0,0" 

HorizontalAlignment="Left" Width="91" VerticalAlignment="Top" 

Click="button3_Click" /&gt; 

&lt;StackPanel Height="346" HorizontalAlignment="Left" Margin="514,19,0,0" 

Name="stackPanel1" VerticalAlignment="Top" Width="460" /&gt; 

&lt;/Grid&gt; 

複制代碼 

        在這裡我們建立一個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); 

/// &lt;summary&gt; 

/// 儲存圖檔, 

/// &lt;/summary&gt; 

/// &lt;param name="bitmap"&gt;&lt;/param&gt; 

/// &lt;param name="fs"&gt;&lt;/param&gt; 

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 &lt; bands; i++) 

raster[i] = new byte[width, height]; 

for (int row = 0; row &lt; height; row++) 

for (int column = 0; column &lt; width; column++) 

int pixel = bitmap.Pixels[width * row + column]; 

raster[0][column, row] = (byte)(pixel &gt;&gt; 16); 

raster[1][column, row] = (byte)(pixel &gt;&gt; 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(); 

本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/826439

繼續閱讀