Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地【附带实例源码】...
生活随笔
收集整理的這篇文章主要介紹了
Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地【附带实例源码】...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
???????? 在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中捕捉视频,截图保存到本地【附带实例源码】...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UML建模的要点总结
- 下一篇: switch_to及ret_from_s