1、主程序中头部加入:
xmlns:WPFMediaKit="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit"> 2、主窗口中加入一个提供选择摄 像头的combox <comboBox name="caps" ></comboBox> 3、加入wpfmediakit控件 <WPFMediaKit:VideoCaptureElement x:Name="CaptureElement" Grid.Row="1" /> 4、加入拍照按钮 <button name=‘btncap‘ value=‘拍照‘>
5、窗体加载时写入代码:
private void Window_Loaded(object sender, RoutedEventArgs e)
{//复选数据源指定为MultimediaUtil类的VideoInputNames属性,这是一个获取本主可控摄像头设备名称的集合。
cmbcapture.ItemsSource = MultimediaUtil.VideoInputNames; // 如果存在摄像设备,则将第一设备设为默认选择项目。
if (MultimediaUtil.VideoInputNames.Length > 0)
{
cmbcapture.SelectedIndex = 0;
} // 否则提示不存在摄像设备。
else
{
MessageBox.Show("没有摄像头");
}
}
//comboBox执行操作时,触发SelectionChanged事件,将视频显示设备的源提定为 combox指定的设备。即确定显示设备,到这步,则可以实现图像的产时预览了。
private void cmbcapture_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
CaptureElement.VideoCaptureSource = (string)cmbcapture.SelectedItem;
}
//执行拍照操作----
private void Button_Click(object sender, RoutedEventArgs e)
{ // 建立目标渲染图像器,高度为前台控件实显高度,此处不能使用.width或.height属性,否则出现错误。
RenderTargetBitmap bitmap = new RenderTargetBitmap((int)CaptureElement.ActualWidth,(int)CaptureElement.ActualHeight,96,96,PixelFormats.Default); // 为了避免图像抓取出现黑边现象,需要对图象进行重新测量及缩放,执行以下操作,关键……
CaptureElement.Measure(CaptureElement.RenderSize);
CaptureElement.Arrange(new Rect(CaptureElement.RenderSize)); // 指定图像渲染目标
bitmap.Render(CaptureElement); // 建立图像解码器。类型为jpeg
BitmapEncoder encoder = new JpegBitmapEncoder(); // 将当前渲染器中渲染位图作为一个位图帧加入解码器,进行解码,取得数据流。
encoder.Frames.Add(BitmapFrame.Create(bitmap)); // 建立内存流,将得到解码图像流写入内存流。
using (MemoryStream stream = new MemoryStream())
{
encoder.Save(stream);
byte[] pics = stream.ToArray(); // 将流以文件形式存储于计算机中。
File.WriteAllBytes(@"D:\2.jpg", pics);
} // 预览效果暂停。
CaptureElement.Pause();
}
注:以上效果实现过程中,可以通过CaptureElement.Plary(),重新激活设备,实现重拍。 虽然上述可以基本解决拍照问题,但仍有部分问题存在,就是黑边。解决方式,自己试着通过处理CaptureElement控件,即前台直接为其指定大小,但这个大小指定一定要与当前电脑的视频摄像设备的正常分辩率相匹配,只要比例 相等即可,大小可以不等,这样拍出的内容就不存在黑边了,或许有更好的办法,留待以后研究……