[讨论] 摄像头编程类+类调用+例子

dtcxn   2010-6-5 19:48 楼主


using System; using System.Runtime.InteropServices; using System.Drawing.Imaging; using System.Windows.Forms; using System.Drawing; namespace YHhotel.YHhotelWindows //注意这里要改为自己的项目名 { /// /// Class1 的摘要说明。 /// public class video { //5个传入参数 private IntPtr myHand; private int myWidth; private short myHeight; private int myLeft; private int myTop; //调用avicap32.dll public struct videohdr_tag { public byte[] lpData; public int dwBufferLength; public int dwBytesUsed; public int dwTimeCaptured; public int dwUser; public int dwFlags; public int[] dwReserved; } [DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern int capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszWindowName, int dwStyle, int x, int y, int nWidth, short nHeight, int hWndParent, int nID); [DllImport("avicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern bool capGetDriverDescriptionA(short wDriver, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszName, int cbName, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszVer, int cbVer); [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern bool DestroyWindow(int hndw); [DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern int SendMessage(int hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)] object lParam); [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern int SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags); [DllImport("vfw32.dll")] public static extern string capVideoStreamCallback(int hwnd, videohdr_tag videohdr_tag); [DllImport("vicap32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern bool capSetCallbackOnFrame(int hwnd, string s); //自定义参数: private int hHwnd; //构造函数 public video(IntPtr myPtr, int left, int top, int width, short height) { myHand = myPtr; myLeft = left; myTop = top; myWidth = width; myHeight = height; // // TODO: 在此处添加构造函数逻辑 // } //打开视频: public void opVideo() { int intDevice = 0; string refDevice = intDevice.ToString(); hHwnd = capCreateCaptureWindowA(ref refDevice, 1342177280, 0, 0, 640, 480, myHand.ToInt32(), 0); if (SendMessage(hHwnd, 0x40a, intDevice, 0) > 0) { SendMessage(this.hHwnd, 0x435, -1, 0); SendMessage(this.hHwnd, 0x434, 0x42, 0); SendMessage(this.hHwnd, 0x432, -1, 0); SetWindowPos(this.hHwnd, 1, 0, 0, myWidth, Convert.ToInt32(myHeight), 6); } else { DestroyWindow(this.hHwnd); } } //停止视频 public void CloVideo() { SendMessage(this.hHwnd, 0x40b, 0, 0); DestroyWindow(this.hHwnd); } //捕获视频 public Image CatchVideo() { SendMessage(this.hHwnd, 0x41e, 0, 0); IDataObject obj1 = Clipboard.GetDataObject(); Image getIma = null; if (obj1.GetDataPresent(typeof(Bitmap))) { Image image1 = (Image)obj1.GetData(typeof(Bitmap)); getIma = image1; } return getIma; } } } 以下是WINFORM调用代码 public video vd;//申明Video,最好是全局的Video变量 private void Form1_Load(object sender, EventArgs e) { vd = new video(pictureBox1.Handle, this.pictureBox1.Left, this.pictureBox1.Top, this.pictureBox1.Width, (short)this.pictureBox1.Height); vd.opVideo(); } private void button1_Click(object sender, EventArgs e) { pictureBox2.Image = vd.CatchVideo(); } private void button2_Click(object sender, EventArgs e) { pictureBox2.Image =null; } private void button3_Click(object sender, EventArgs e) { this.Close(); }

 

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复