您的位置:首页 > 编程语言 > C#

C# 如何采集摄像头的视频

2010-06-15 14:35 411 查看
文件:VedioCapture2.cs:
using System;
using System.Runtime.InteropServices;

namespace Wuyin.ShoesManager
{
/// <summary>
/// VedioCapture 的摘要说明。
/// </summary>
public class VedioCapture
{
private int hCaptureM;
private bool isUnLoad = false;
public VedioCapture()
{
}
[DllImport("avicap32.dll")]
private static extern int capCreateCaptureWindow( string strWindowName, int dwStyle, int x, int y ,int width, int height , int hwdParent, int nID );
[DllImport("user32.dll")]
private static extern int SendMessage( int hwnd , int wMsg, int wParam , int lParam );
[DllImport("user32.dll")]
private static extern int SendMessage( int hwnd , int wMsg, int wParam , string lParam );
[DllImport("Kernel32.dll")]
private static extern bool CloseHandle( int hObject );
public bool Initialize( System.Windows.Forms.Control aContainer , int intWidth, int intHeight )
{
hCaptureM = capCreateCaptureWindow( "", 0x40000000 | 0x10000000, 0,0,intWidth,intHeight,aContainer.Handle.ToInt32() ,1 );
if( hCaptureM == 0 ) return false;

int ret = SendMessage( hCaptureM , 1034, 0,0 );
if( ret == 0 )
{
CloseHandle(hCaptureM);
return false;
}
//WM_CAP_SET_PREVIEW
ret = SendMessage( hCaptureM, 1074, 1, 0 );
if( ret == 0 )
{
this.UnLoad();
return false;
}
//WM_CAP_SET_SCALE
ret = SendMessage( hCaptureM, 1077, 1, 0 );
if( ret == 0 )
{
this.UnLoad();
return false;
}
//WM_CAP_SET_PREVIEWRATE
ret = SendMessage( hCaptureM, 1076, 66, 0 );
if( ret == 0 )
{
this.UnLoad();
return false;
}
return true;
}

public void SingleFrameBegin()
{
//
int ret = SendMessage( hCaptureM, 1094 , 0, 0 );
}
public void SingleFrameEnd()
{
//
int ret = SendMessage( hCaptureM, 1095 , 0, 0 );
}

public void SingleFrameMode()
{
//WM_CAP_GRAB_FRAME
int ret = SendMessage( hCaptureM, 1084 , 0, 0 );
//WM_CAP_SET_PREVIEW
//int ret = SendMessage( hCaptureM, 1074 , 0, 0 );
//WM_CAP_SINGLE_FRAME
//ret = SendMessage( hCaptureM, 1096 , 0, 0 );
}
public void PreviewMode()
{
int ret = SendMessage( hCaptureM, 1074 , 1, 0 );
}

public void UnLoad()
{
int ret = SendMessage( hCaptureM, 1035, 0, 0 );
CloseHandle( this.hCaptureM );
isUnLoad = true;
}

public void CopyToClipBorad()
{
int ret = SendMessage( hCaptureM, 1054, 0, 0 );
}

public void ShowFormatDialog()
{
int ret = SendMessage( hCaptureM, 1065, 0, 0 );
}
public void SaveToDIB( string fileName )
{
int ret = SendMessage( hCaptureM, 1049, 0, fileName );
}

public void ShowDisplayDialog()
{
int ret = SendMessage( hCaptureM, 1067, 0, 0 );
}
public System.Drawing.Image getCaptureImage()
{
System.Windows.Forms.IDataObject iData = System.Windows.Forms.Clipboard.GetDataObject();
System.Drawing.Image retImage = null;
if( iData != null )
{
if( iData.GetDataPresent( System.Windows.Forms.DataFormats.Bitmap ) )
{
retImage = (System.Drawing.Image)iData.GetData( System.Windows.Forms.DataFormats.Bitmap );
}
else if( iData.GetDataPresent( System.Windows.Forms.DataFormats.Dib ) )
{
retImage = (System.Drawing.Image)iData.GetData( System.Windows.Forms.DataFormats.Dib );
}
}
return retImage;
}

~VedioCapture()
{
if( !isUnLoad )
{
this.UnLoad();
}
}
}
}

窗体的cs:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using webcam;
using Wuyin.ShoesManager;
using PickHead;

namespace sxt
{
/// <summary>
/// 摄像头采集保存照片程序。
/// VedioCapture.cs和VedioCapture2.cs是两种不同的摄像头采集代码。
/// 本程序用的是VedioCapture2.cs的方法,注释掉的部分是用VedioCapture.cs的方法
/// int64@163.com
/// 2005年3月28日
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button b_play;
private System.Windows.Forms.Panel panelPreview;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button b_stop;
private System.Windows.Forms.Button b_close;
private System.Windows.Forms.Button b_getpic;
private System.Windows.Forms.PictureBox pictureBox1;
WebCamera wc;
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
VedioCapture xxx=new VedioCapture();
private System.Windows.Forms.TextBox t_out;
int savefiles;
private System.Windows.Forms.Button b_save;
private System.Windows.Forms.Button b_savepic;
private System.Windows.Forms.Button button1;
string filepath;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.b_play = new System.Windows.Forms.Button();
this.b_stop = new System.Windows.Forms.Button();
this.panelPreview = new System.Windows.Forms.Panel();
this.b_close = new System.Windows.Forms.Button();
this.b_getpic = new System.Windows.Forms.Button();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.b_save = new System.Windows.Forms.Button();
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
this.t_out = new System.Windows.Forms.TextBox();
this.b_savepic = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// b_play
//
this.b_play.Enabled = false;
this.b_play.Location = new System.Drawing.Point(8, 312);
this.b_play.Name = "b_play";
this.b_play.TabIndex = 0;
this.b_play.Text = "&Play";
this.b_play.Click += new System.EventHandler(this.b_play_Click);
//
// b_stop
//
this.b_stop.Location = new System.Drawing.Point(96, 312);
this.b_stop.Name = "b_stop";
this.b_stop.TabIndex = 1;
this.b_stop.Text = "&Stop";
this.b_stop.Click += new System.EventHandler(this.b_stop_Click);
//
// panelPreview
//
this.panelPreview.Location = new System.Drawing.Point(8, 8);
this.panelPreview.Name = "panelPreview";
this.panelPreview.Size = new System.Drawing.Size(352, 288);
this.panelPreview.TabIndex = 2;
//
// b_close
//
this.b_close.Location = new System.Drawing.Point(648, 312);
this.b_close.Name = "b_close";
this.b_close.TabIndex = 3;
this.b_close.Text = "&Close";
this.b_close.Click += new System.EventHandler(this.b_close_Click);
//
// b_getpic
//
this.b_getpic.Location = new System.Drawing.Point(184, 312);
this.b_getpic.Name = "b_getpic";
this.b_getpic.TabIndex = 5;
this.b_getpic.Text = "&GetPic";
this.b_getpic.Click += new System.EventHandler(this.b_getpic_Click);
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(376, 8);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(352, 288);
this.pictureBox1.TabIndex = 6;
this.pictureBox1.TabStop = false;
//
// b_save
//
this.b_save.Location = new System.Drawing.Point(360, 312);
this.b_save.Name = "b_save";
this.b_save.TabIndex = 7;
this.b_save.Text = "S&ave";
this.b_save.Click += new System.EventHandler(this.b_save_Click);
//
// saveFileDialog1
//
this.saveFileDialog1.FileName = "shipin.jpg";
this.saveFileDialog1.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*";
this.saveFileDialog1.RestoreDirectory = true;
this.saveFileDialog1.Title = "保存文件";
//
// t_out
//
this.t_out.BackColor = System.Drawing.SystemColors.InactiveBorder;
this.t_out.ForeColor = System.Drawing.SystemColors.WindowText;
this.t_out.Location = new System.Drawing.Point(8, 344);
this.t_out.Name = "t_out";
this.t_out.Size = new System.Drawing.Size(712, 21);
this.t_out.TabIndex = 8;
this.t_out.Text = "";
//
// b_savepic
//
this.b_savepic.Enabled = false;
this.b_savepic.Location = new System.Drawing.Point(272, 312);
this.b_savepic.Name = "b_savepic";
this.b_savepic.TabIndex = 9;
this.b_savepic.Text = "Sa&vePic";
this.b_savepic.Click += new System.EventHandler(this.b_savepic_Click);
//
// button1
//
this.button1.Location = new System.Drawing.Point(448, 312);
this.button1.Name = "button1";
this.button1.TabIndex = 10;
this.button1.Text = "button1";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(744, 373);
this.Controls.Add(this.button1);
this.Controls.Add(this.b_savepic);
this.Controls.Add(this.t_out);
this.Controls.Add(this.b_save);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.b_getpic);
this.Controls.Add(this.b_close);
this.Controls.Add(this.panelPreview);
this.Controls.Add(this.b_stop);
this.Controls.Add(this.b_play);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "我的摄像头";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

Top
回复人:int64(@163.com:所有的程序员都应该团结起来!) ( 五级(中级)) 信誉:100 	2007-3-16 14:46:13 	得分:0
?

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
savefiles=1;
filepath="";
//VedioCapture2.cs的方法
xxx.Initialize( panelPreview,panelPreview.Width,panelPreview.Height);
//VedioCapture.cs的方法
/*wc = new WebCamera( panelPreview.Handle,panelPreview.Width,panelPreview.Height);
wc.StartWebCam();*/
}
private void b_play_Click(object sender, System.EventArgs e)
{
xxx.Initialize( panelPreview,panelPreview.Width,panelPreview.Height);
panelPreview.Visible=true;
b_play.Enabled = false;
b_stop.Enabled = true;
this.b_savepic.Enabled=false;
this.b_save.Enabled=true;
this.b_getpic.Enabled=true;
this.t_out.Text="成功获取视频!";
/*wc = new WebCamera( panelPreview.Handle,panelPreview.Width,panelPreview.Height);
wc.StartWebCam();*/
}
private void b_stop_Click(object sender, System.EventArgs e)
{
xxx.UnLoad();
panelPreview.Visible=false;
b_play.Enabled = true;
b_stop.Enabled = false;
this.b_save.Enabled=false;
this.b_savepic.Enabled=false;
this.b_getpic.Enabled=false;
this.t_out.Text="停止获取视频!";
/* wc.CloseWebcam();*/
}

private void b_close_Click(object sender, System.EventArgs e)
{
this.Close();
}

private void b_getpic_Click(object sender, System.EventArgs e)
{
this.t_out.Text="";
xxx.CopyToClipBorad();
this.pictureBox1.Image = xxx.getCaptureImage();
this.b_savepic.Enabled=true;
this.t_out.Text="获取图片成功!";
}

private void b_savepic_Click(object sender, System.EventArgs e)
{
this.t_out.Text="";
string filename;
if(filepath=="")
{
filename="图片"+System.DateTime.Now.Date.ToShortDateString();
this.saveFileDialog1.FileName=filename;
if(saveFileDialog1.ShowDialog() == DialogResult.OK)
filepath=this.saveFileDialog1.FileName;
else
return;
}
filename="";
if(savefiles<10)
filename+="_00"+savefiles.ToString();
else if(savefiles<100)
filename+="_0"+savefiles.ToString();
else
filename+="_"+savefiles.ToString();
int leg=filepath.Length;
filename=filepath.Substring(0,leg-4)+filename+filepath.Substring(leg-4,4);
this.pictureBox1.Image.Save(filename);
this.t_out.Text="保存图片“"+filename+"”成功!";
if(savefiles%2==0)
this.t_out.ForeColor=Color.Red;
else
this.t_out.ForeColor=Color.Blue;
savefiles++;
}

private void b_save_Click(object sender, System.EventArgs e)
{
this.t_out.Text="";
xxx.CopyToClipBorad();
this.pictureBox1.Image = xxx.getCaptureImage();
this.t_out.Text="获取图片成功!";
string filename;
if(filepath=="")
{
filename="图片"+System.DateTime.Now.Date.ToShortDateString();
this.saveFileDialog1.FileName=filename;
if(saveFileDialog1.ShowDialog() == DialogResult.OK)
filepath=this.saveFileDialog1.FileName;
else
return;
}
filename="";
if(savefiles<10)
filename+="_00"+savefiles.ToString();
else if(savefiles<100)
filename+="_0"+savefiles.ToString();
else
filename+="_"+savefiles.ToString();
int leg=filepath.Length;
filename=filepath.Substring(0,leg-4)+filename+filepath.Substring(leg-4,4);
this.pictureBox1.Image.Save(filename);
this.t_out.Text="保存图片“"+filename+"”成功!";
if(savefiles%2==0)
this.t_out.ForeColor=Color.Red;
else
this.t_out.ForeColor=Color.Blue;
savefiles++;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐