wpf调用摄像头/切换摄像头/保存图片及像素问题

一篇说一下AForge.net具体使用和注意的地方。

1、获取设备上的所有摄像头:

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    // 设定初始视频设备
    videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    xcount = videoDevices.Count;
    if (videoDevices.Count > 0)
    {   // 默认设备
sourcePlayer.VideoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
    }
    sourcePlayer.Start();
   // 设置图片框初始图像
    BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
Properties.Resources.noimage.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
    fingerPictureBox1.InitialImage = bs; 
    if (sourcePlayer.IsRunning)
    {
button_Capture.IsEnabled = true;
    }
}
sourcePlayer.IsRunning标示的是摄像头是否工作。

2、多个摄像头切换:

/// <summary>
/// 切换摄像头
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_Qh_Click(object sender, RoutedEventArgs e)
{
    if (j < xcount-1)
    {
j = j + 1;
    }
    else if (j == xcount-1)
    {
j = 0;   
    }
    sourcePlayer.Stop();
    sourcePlayer.VideoSource = new VideoCaptureDevice(videoDevices[j].MonikerString);
    sourcePlayer.Start();
}

3、拍摄照片:

/// <summary>
/// 拍摄图像
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_Capture_Click(object sender, RoutedEventArgs e)
{
    // 判断视频设备是否开启
    try
    {
if (sourcePlayer.IsRunning)
{   // 进行拍照
    if (fingerPictureBox1.Visibility == Visibility.Hidden)
    {
object box = this.FindName("fingerPictureBox1");
if (box is FingerPictureBox)
{
    (box as FingerPictureBox).ActiveImage = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
sourcePlayer.GetCurrentVideoFrame().GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
fingerPictureBox1.Visibility = Visibility.Visible;
cam_sumit.Visibility = Visibility.Hidden;
lb_text.Content = "启动摄像头";
    }
    else {
fingerPictureBox1.Visibility = Visibility.Hidden;
cam_sumit.Visibility = Visibility.Visible;
lb_text.Content = "拍摄图像";      
    }
}
    }
    catch {
MessageBox.Show("请等待摄像头准备就绪再拍照!");
    }
}

4、保存并返回:

/// <summary>
/// 保存返回
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_Close_Click(object sender, RoutedEventArgs e)
{
    var tempfilepath = "";
    RenderTargetBitmap bmp = new RenderTargetBitmap(
    (int)fingerPictureBox1.ActualWidth, (int)fingerPictureBox1.ActualHeight,
    96, 96, PixelFormats.Default);
    fingerPictureBox1.Measure(fingerPictureBox1.RenderSize);
    fingerPictureBox1.Arrange(new Rect(fingerPictureBox1.RenderSize));
    bmp.Render(fingerPictureBox1);
    BitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bmp));
    using (MemoryStream ms = new MemoryStream())
    {
encoder.Save(ms);
CaptureData = ms.ToArray();
var  temppath = AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.ToString("yyyy-mm-dd-hh-mm-sss") + ".jpg";
File.WriteAllBytes(temppath, CaptureData);
tempfilepath = FileOperation.AddFile(Common.Contract.WebModel.AyncModuleEnum.系统拍照, temppath, true);
    }
    if (CameraDoEvent != null)
    {
CameraDoEvent(tempfilepath);
    }
    this.Close();
}
5、拍摄窗口关闭时一定要关闭摄像头,不然摄像头会一直开着:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (sourcePlayer.IsRunning)
    {   // 停止视频
sourcePlayer.SignalToStop();
sourcePlayer.WaitForStop();
sourcePlayer.Stop();
    }
}

时间: 2024-09-23 00:06:52

wpf调用摄像头/切换摄像头/保存图片及像素问题的相关文章

C#调用本机摄像头

原文:C#调用本机摄像头 这段时间一个小项目中需要调用本机的摄像头进行拍照,网上搜集了一些资料以及解决的一些小问题,在此记录以便后续使用. 硬件环境:联想C360一体机,自带摄像头 编写环境:vs2010 语言:C# WPF   下载AForge类库,并添加引用: using AForge; using AForge.Controls; using AForge.Video; using AForge.Video.DirectShow; using Size = System.Drawing.S

android-Android平板通过OTG调用外接的摄像头

问题描述 Android平板通过OTG调用外接的摄像头 如题,需求是点击手机自带的相机调用,怎么实现这个功能呢?特别是代码部分,该如何下手?求教下,谢谢各位了. 解决方案 http://www.guokr.com/post/357593/

activex-JSP页面用js调用ActiveX使用摄像头

问题描述 JSP页面用js调用ActiveX使用摄像头 这是一个VB程序,调用了一个TesoSeeu.ocx打开摄像头拍照的程序http://pan.baidu.com/s/1sjyyo0H 现在我想在JSP页面上使用这个ocx,可以吗? 求各位大神给一个例子 这个ocx好像是拍照后把数据保存在内存,js没法调用了吧? 解决方案 可以,不过需要预先安装这个控件到客户端计算机,并且在浏览器的安全设置中允许.而且不是所有浏览器都支持ocx,只能用IE或者兼容的浏览器. 解决方案二: 控件有暴露接口给

android-关于安卓摄像头切换问题

问题描述 关于安卓摄像头切换问题 bt_change.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCamera.stopPreview(); mCamera.release(); mCamera =null; mCamera = Camera.open(1); mPreview.setCamera(mCamera); mCamera.startPreview();

前后摄像头切换黑屏问题

问题描述 前后摄像头切换黑屏问题 打开快拍,默认是使用后置摄像头,点切换到前摄像头,再切到后置摄像头有时会是黑屏.请问是什么原因?有什么解决办法? 解决方案 自己开发的还是手机自带的?

android-关于安卓开发中Camera中切换前后摄像头切换的问题,怎么切换

问题描述 关于安卓开发中Camera中切换前后摄像头切换的问题,怎么切换 用的是http://www.cnblogs.com/mengdd/archive/2013/04/06/3002975.html 上的代码 怎么实现 求助,弄了一天没搞懂啊 解决方案 android camera 摄像头切换android camera 摄像头切换---------------------- 解决方案二: 百度前两页就有答案的就别提问了 解决方案三: csdn上类似功能的代码好多的,去下载频道吧

关于安卓录制视频时切换摄像头

问题描述 关于安卓录制视频时切换摄像头 当我正在用后置摄像头录制视频时,切换了到前置摄像头,后面生成的视频文件是否是连续的,就是想问这样生成的视频文件是否是刚才拍摄的前后摄像头连续的视频,而不是切换的时候文件就不连续了 解决方案 不是连续的吧......

android 视频通话摄像头切换

问题描述 环信自带的视频通话使用的是前置摄像头,没有任何问题.现在我在此基础上加了前后摄像头切换,出现了一个问题.就是发起方使用前置摄像头,接收方使用后置摄像头时,发起方看到的对方视频是颠倒的.接收方一切正常.麻烦提供下解决思路 解决方案 MediaRecorder 中一个方法setCamera();所以可以先设置好摄像头的参数,然后再设置到MediaRecorder 中(但是录制前需要解锁). 部分关键的代码如果下: //初始化相机信息 Camera mCamera = Camera.open

苹果5s摄像头怎么切换?苹果iPhone5s摄像头切换教程

1.我们在手机中点击相机进入之后在拍照界面 我们点击[切换]按钮即可进行iphone5s前置摄像头切换了.当大家已经切换到前置摄像头时,大家可以看顶部那横,将会失去[闪光灯]按钮.当大家看到顶部无闪光灯按钮时,自己现在使用的即为前置摄像头.