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

C#学习笔记——摄像头

2013-02-09 13:22 190 查看
界面:





源码:

[code] using System;


using System.Collections.Generic;


using System.ComponentModel;


using System.Data;


using System.Drawing;


using System.Linq;


using System.Text;


using System.Windows.Forms;




//添加引用


using System.Runtime.InteropServices;


using System.Drawing.Imaging;






namespace Camera


{




 public partial class FormMain : Form


{


 WebCamera wc;


 //声明一个API函数 


 [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]


private static extern bool BitBlt(


 IntPtr hdcDest, // 目标 DC的句柄 


 int nXDest,


 int nYDest,


 int nWidth,


 int nHeight,


 IntPtr hdcSrc, // 源DC的句柄 


 int nXSrc,


 int nYSrc,


 System.Int32 dwRop // 光栅的处理数值 


 ); 




 public FormMain()


{


 InitializeComponent();


}




 private void btnPlay_Click(object sender, EventArgs e)


{


 btnPlay.Enabled = false;


 btnStop.Enabled = true;


 //panelPreview.Size = new Size(330, 330);


 wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);


 wc.StartWebCam();


}




 private void FormMain_Load(object sender, EventArgs e)


{


 btnPlay.Enabled = false;


 btnStop.Enabled = true;


 //panelPreview.Size = new Size(330, 330);


 wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);


 wc.StartWebCam();


}




 private void btnStop_Click(object sender, EventArgs e)


{


 btnPlay.Enabled = true;


 btnStop.Enabled = false;


 wc.CloseWebcam();


}




 private void btnPhoto_Click(object sender, EventArgs e)


{


 //创建一个以当前控件区域屏幕为模板的图象 


 Graphics gPanel = this.panelPreview.CreateGraphics(); 




 Bitmap bmSave = new Bitmap(this.panelPreview.Width, this.panelPreview.Height); //用于保存图片的位图对象


 Graphics gSave = Graphics.FromImage(bmSave);


 //得到屏幕的DC 


 IntPtr dcPanel = gPanel.GetHdc();


 //得到Bitmap的DC 


 IntPtr dcSave = gSave.GetHdc();


 //调用此API函数,实现屏幕捕获 


 BitBlt(dcSave, 0, 0, this.panelPreview.Width, this.panelPreview.Height, dcPanel, 0, 0, 13369376);


 //释放掉屏幕的DC 


 gPanel.ReleaseHdc(dcPanel);


 //释放掉Bitmap的DC 


 gSave.ReleaseHdc(dcSave);


 //以JPG文件格式来保存 


 bmSave.Save(@"D:/Photo.jpg", ImageFormat.Jpeg);


 MessageBox.Show("当前图像已经保存为D盘Photo文件!"); 


}


}






//show Video class


public class showVideo


{


 // showVideo calls


 [DllImport("avicap32.dll")] 


 public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);


 [DllImport("avicap32.dll")] 


 public static extern bool capGetDriverDescriptionA(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);


 [DllImport("User32.dll")] 


 public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam); 


 [DllImport("User32.dll")] 


 public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam); 


 [DllImport("User32.dll")] 


 public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam); 


 [DllImport("User32.dll")] 


 public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref BITMAPINFO lParam);


 [DllImport("User32.dll")] 


 public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);


 [DllImport("avicap32.dll")]


 public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize );




 // Constants


 public const int WM_USER = 0x400;


 public const int WS_CHILD = 0x40000000;


 public const int WS_VISIBLE = 0x10000000;


 public const int SWP_NOMOVE = 0x2;


 public const int SWP_NOZORDER = 0x4;


 public const int WM_CAP_DRIVER_CONNECT = WM_USER + 10;


 public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;


 public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + 5;


 public const int WM_CAP_SET_PREVIEW = WM_USER + 50;


 public const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;


 public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;




 // Structures


 [StructLayout(LayoutKind.Sequential)] public struct VIDEOHDR


{


[MarshalAs(UnmanagedType.I4)] public int lpData;


[MarshalAs(UnmanagedType.I4)] public int dwBufferLength;


[MarshalAs(UnmanagedType.I4)] public int dwBytesUsed;


[MarshalAs(UnmanagedType.I4)] public int dwTimeCaptured;


[MarshalAs(UnmanagedType.I4)] public int dwUser;


[MarshalAs(UnmanagedType.I4)] public int dwFlags;


[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] public int[] dwReserved;


}




 [StructLayout(LayoutKind.Sequential)] public struct BITMAPINFOHEADER


{


[MarshalAs(UnmanagedType.I4)] public Int32 biSize ;


[MarshalAs(UnmanagedType.I4)] public Int32 biWidth ;


[MarshalAs(UnmanagedType.I4)] public Int32 biHeight ;


[MarshalAs(UnmanagedType.I2)] public short biPlanes;


[MarshalAs(UnmanagedType.I2)] public short biBitCount ;


[MarshalAs(UnmanagedType.I4)] public Int32 biCompression;


[MarshalAs(UnmanagedType.I4)] public Int32 biSizeImage;


[MarshalAs(UnmanagedType.I4)] public Int32 biXPelsPerMeter;


[MarshalAs(UnmanagedType.I4)] public Int32 biYPelsPerMeter;


[MarshalAs(UnmanagedType.I4)] public Int32 biClrUsed;


[MarshalAs(UnmanagedType.I4)] public Int32 biClrImportant;


} 




 [StructLayout(LayoutKind.Sequential)] public struct BITMAPINFO


{


[MarshalAs(UnmanagedType.Struct, SizeConst=40)] public BITMAPINFOHEADER bmiHeader;


[MarshalAs(UnmanagedType.ByValArray, SizeConst=1024)] public Int32[] bmiColors;


}




 public delegate void FrameEventHandler(IntPtr lwnd, IntPtr lpVHdr);




 // Public methods


 public static object GetStructure(IntPtr ptr,ValueType structure)


{


return Marshal.PtrToStructure(ptr,structure.GetType());


}


 


 public static object GetStructure(int ptr,ValueType structure)


{


return GetStructure(new IntPtr(ptr),structure);


}




 public static void Copy(IntPtr ptr,byte[] data)


{


Marshal.Copy(ptr,data,0,data.Length);


}




 public static void Copy(int ptr,byte[] data)


{


Copy(new IntPtr(ptr),data);


}




 public static int SizeOf(object structure)


{


return Marshal.SizeOf(structure); 


}


}




 //Web Camera Class


public class WebCamera


{


 // Constructur


 public WebCamera(IntPtr handle, int width,int height)


{


mControlPtr = handle;


mWidth = width;


mHeight = height;


}




 // delegate for frame callback


 public delegate void RecievedFrameEventHandler(byte[] data);


 public event RecievedFrameEventHandler RecievedFrame;




 private IntPtr lwndC; // Holds the unmanaged handle of the control


 private IntPtr mControlPtr; // Holds the managed pointer of the control


 private int mWidth;


 private int mHeight;




 private showVideo.FrameEventHandler mFrameEventHandler; // Delegate instance for the frame callback - must keep alive! gc should NOT collect it




 // Close the web camera


 public void CloseWebcam()


{


this.capDriverDisconnect(this.lwndC);


}




 // start the web camera


 public void StartWebCam()


{


byte[] lpszName = new byte[100];


byte[] lpszVer = new byte[100];


 


showVideo.capGetDriverDescriptionA(0, lpszName, 100,lpszVer, 100);


this.lwndC = showVideo.capCreateCaptureWindowA(lpszName, showVideo.WS_VISIBLE + showVideo.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);


 


if (this.capDriverConnect(this.lwndC, 0))


{


 this.capPreviewRate(this.lwndC, 66);


 this.capPreview(this.lwndC, true);


 showVideo.BITMAPINFO bitmapinfo = new showVideo.BITMAPINFO(); 


 bitmapinfo.bmiHeader.biSize = showVideo.SizeOf(bitmapinfo.bmiHeader);


 bitmapinfo.bmiHeader.biWidth = 352;


 bitmapinfo.bmiHeader.biHeight = 288;


 bitmapinfo.bmiHeader.biPlanes = 1;


 bitmapinfo.bmiHeader.biBitCount = 24;


 this.capSetVideoFormat(this.lwndC, ref bitmapinfo, showVideo.SizeOf(bitmapinfo));


 this.mFrameEventHandler = new showVideo.FrameEventHandler(FrameCallBack);


 this.capSetCallbackOnFrame(this.lwndC, this.mFrameEventHandler);


 showVideo.SetWindowPos(this.lwndC, 0, 0, 0, mWidth , mHeight , 6);


} 


}




 // private functions


 private bool capDriverConnect(IntPtr lwnd, short i)


{


return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_CONNECT, i, 0);


}




 private bool capDriverDisconnect(IntPtr lwnd)


{


return showVideo.SendMessage(lwnd, showVideo.WM_CAP_DRIVER_DISCONNECT, 0, 0);


}




 private bool capPreview(IntPtr lwnd, bool f)


{


return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEW , f, 0);


}




 private bool capPreviewRate(IntPtr lwnd, short wMS)


{


return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_PREVIEWRATE, wMS, 0);


}




 private bool capSetCallbackOnFrame(IntPtr lwnd, showVideo.FrameEventHandler lpProc)


{ 


return showVideo.SendMessage(lwnd, showVideo.WM_CAP_SET_CALLBACK_FRAME, 0, lpProc);


}




 private bool capSetVideoFormat(IntPtr hCapWnd, ref showVideo.BITMAPINFO BmpFormat, int CapFormatSize)


{


return showVideo.SendMessage(hCapWnd, showVideo.WM_CAP_SET_VIDEOFORMAT, CapFormatSize, ref BmpFormat);


}




 private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr)


{


showVideo.VIDEOHDR videoHeader = new showVideo.VIDEOHDR();


byte[] VideoData;


videoHeader = (showVideo.VIDEOHDR)showVideo.GetStructure(lpVHdr,videoHeader);


VideoData = new byte[videoHeader.dwBytesUsed];


showVideo.Copy(videoHeader.lpData ,VideoData);


if (this.RecievedFrame != null)


 this.RecievedFrame (VideoData);


}


}




}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: